2016-09-27 1 views
0

Одна вещь: я довольно сейчас в мире кодирования, поэтому, возможно, мой вопрос немного глуп ... Я пытался написать функцию, которая возвращает каждый другой элемент кортежа. Самый простой способ, очевидно,разница между диапазоном/len и т. Д. При итерации по кортежам

def oddTuples(aTup): 
    return aTup[::2] 

Я пытался решить эту проблему по-другому, используя следующий код

def oddTuples(aTup): 
    newTup =() 
    for i in len(aTup): 
     if i%2 != 0: 
      newTup = newTup + (i,) 
    return newTup 

Но это не отдай мне ничего.

Я думал, что я (если используется более len) возвращает позицию, поэтому, если aTup = ((12, 34, 'abc', 'dfdf', 2340)) возвращение будет newTup = ((12, 'abc', 2340)).

Что i Перебор при использовании range, len или -в этом прецедентного в то время как итерация for i in aTup:?

+2

'for i in len (aTup)' даст вам ошибку типа: 'TypeError: 'int' object is not itable' –

+0

Возможно, вы использовали' for i in range (len (aTup)): ', который создал бы объект 'range()', который генерирует целые числа до len (aTup) '? Даже с этим исправлением вы должны возвращать * целые индексы *, а не значения из 'aTup'. –

ответ

0

for цикл Python является foreach construct; он будет перебирать последовательность или итерируемую и привязывать целевую переменную (i в вашем случае) к каждому элементу в этой последовательности один за другим.

Итак, для for i in aTuple: с каждой итерацией i привязан к следующему значению из кортежа. Если вы использовали объект range(), тогда цикл по этому объекту будет производить целые числа в диапазоне от начала (по умолчанию до 0) до конечного значения минус 1 (конечное значение исключено).

Ваш код, однако, не проходит через range(); вы пытаетесь перебрать результат len(aTuple), который будет состоять из одного целого . Это дает исключение TypeError: 'int' object is not iterable.

Если вы хотите использовать range() type, это прекрасно, но тогда вам придется перевести индекс обратно в значение из aTuple с помощью индексации:

def oddTuples(aTup): 
    newTup =() 
    for i in range(len(aTup)): 
     if i%2 != 0: 
      newTup = newTup + (aTup[i],) 
    return newTup 

Здесь aTup[i] производит значение по индексу i ; где i - это индекс 1, 3 и т. д., поэтому вы получаете каждый нечетный элемент. Обратите внимание, что это отличается от от aTup[::2], который начинается с 0 и включает в себя каждый элемент с четным номером! Python начинает отсчет с 0, поэтому учитывайте это при подсчете элементов.

Вы можете избежать необходимости индексирования с помощью enumerate() function; для каждого элемента в последовательности он будет генерировать кортеж с постоянно увеличивающимся номером индекса. Давайте использовать, чтобы зафиксировать нечетный даже вопрос, смешивая в некоторой += дополненной уступке тоже:

def oddTuples(aTup): 
    newTup =() 
    for i, value in enumerate(aTup): 
     if i % 2 == 0: 
      newTup += value, 
    return newTup 

Вы действительно не нужны (...) круглых скобок здесь либо кортежи формируются запятыми (для пустого кортежа, за исключением, и использовать круглые скобки, когда запятая может означать что-то еще, например, в вызове функции).

+0

Спасибо за этот невероятно подробный ответ. Высоко ценится! –

0
newTup =() 
b = True 
for i in aTup: 
    if b: 
     newTup = newTup + (i,) 
    b = not b 
return newTup 

Попробуйте это для размера. Заявление for дает нам значения кортежа один за другим, и boolean b позволяет нам пропускать все остальные.

Лучший способ сделать это - это то, как вы помещаете в начало своего сообщения. Если вы не понимаете, что он делает, я предлагаю исследовать нарезку списка.

0
for i in len(aTup): 

вызовет ошибку, потому что len() возвращает целое число, которое не может быть итерации в цикле for.

В случае:

for i in range(len(aTup)): 

В каждой итерации цикла i будет целое число, начиная от 0 и до длины вашего кортежа - 1.

В случае:

for i in aTup: 

Каждый i будет членом кортежа. Лучший способ привыкнуть к тому, как это работает, - просто открыть интерактивный интерпретатор и сделать некоторые эксперименты!

>>> aTup = ('hello', 'world') 
>>> for i in len(aTup): 
...  print i 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'int' object is not iterable 
>>> for i in range(len(aTup)): 
...  print i 
... 
0 
1 
>>> for i in aTup: 
...  print i 
... 
hello 
world 
>>> 
0

i не даст вам индекс вместо этого он будет возвращать значение.

Вы можете решить вашу проблему, просто указав локальную переменную, которая может быть инкриминирована для каждой итерации, и использовать ее для получения нечетных индексированных значений.

Summery: используйте локальную переменную, чтобы действовать как индекс, поскольку Python for вернет значение.

0

Вот пример, который вы можете использовать для завершения программы.

myTup = (1,2,3,4,5,6,7,8) 

for i in range(len(myTup)): 
    if i%2 != 0: 
     print("Tuple items: " ,myTup[i]) 
     print("i here is: " , i) 

Len -> дает вам длину объекта; например. если вы говорите len (myTup).Это будет 8

Диапазон -> как диапазон, (количество элементов), который вы будете итерировать.

i -> - указатель.

Вот выход

Tuple items: 2 
i here is: 1 
Tuple items: 4 
i here is: 3 
Tuple items: 6 
i here is: 5 
Tuple items: 8 
i here is: 7 

Вы можете получить тот же результат выше, запустив код без использования диапазона и LEN.

for i in myTup: 
    if i%2 != 0: 
     print("Tuple items: " ,myTup[i]) 
     print("i here is: " , i) 
+0

Спасибо за помощь, @ Мани. –

+0

Добро пожаловать :) – Maddy