迭代元组时,range / len等之间的差异

时间:2016-09-27 13:34:18

标签: python for-loop range iteration tuples

预先做的一件事:我现在对编码世界已经相当了所以也许我的问题有点愚蠢...我试图编写一个函数来返回元组的每个其他元素。最简单的方法是

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进行迭代时与lenfor i in aTup:或-in一起使用时迭代结束了什么?

5 个答案:

答案 0 :(得分:0)

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

试试大小。 for语句逐个给出了元组值,boolean b让我们跳过其他每个元组。

执行此操作的最佳方式是放置在帖子顶部的方式。如果你不明白它在做什么,那么我建议研究列表切片。

答案 1 :(得分: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
>>> 

答案 2 :(得分:0)

i不会为您提供索引,而是会返回值。

只需定义一个可以为每次迭代判定的局部变量并使用它来获取奇数索引值,就可以解决问题。

Summery:使用局部变量作为索引,因为Python将返回值。

答案 3 :(得分: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 - &gt;给你一个物体的长度;例如。如果你说len(myTup)。那将是8

范围 - &gt;就像一个范围,(元素的数量),你将迭代。

- &gt;是索引。

这是输出

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

您可以通过运行代码而不使用range和len获得相同的输出。

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

答案 4 :(得分:0)

Python的for循环是foreach construct;它将循环遍历序列或迭代,并将目标变量(在您的情况下为i)逐个绑定到该序列中的每个元素。

因此,对于for i in aTuple:,每次迭代时,i都绑定到元组的下一个值。如果您使用了range()对象,那么循环该对象将产生该范围内的整数,从开始(默认为0)到结束值减去1(排除结束值)。 / p>

但是,您的代码并不会循环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是索引13等,所以你得到每个奇数元素。请注意,此aTup[::2]不同,00开始,包括每个偶数元素! Python从+=开始计数,因此在计算元素时要考虑到这一点。

您可以使用enumerate() function避免重新编入索引;对于序列中的每个元素,它会产生一个索引号不断增加的元组。让我们用它来修复奇偶问题,同时混合一些def oddTuples(aTup): newTup = () for i, value in enumerate(aTup): if i % 2 == 0: newTup += value, return newTup 扩充分配:

(...)

你也不需要这里的@contact.update(contact_params) 括号,元组由逗号组成(空元组除外,当逗号可能表示其他内容时使用括号,如在函数调用中)