1
list(zip(['A','B','C'], [x for x in range(1,4)]))

我想重写上面的内容,让这个拉链在理解中。下面是一个尝试:

[list(zip(['A','B','C'], x) for x in range(1,4))]

或者 [zip(['A','B','C'], x) for x in range(1,4)]

它不起作用并出现TypeError: zip argument #2 must support iteration

我可以知道哪里出错了吗?

4

3 回答 3

3

[x for x in range(1,4)]只不过是list(range(1, 4)),所以使用:

list(zip(['A', 'B', 'C'], range(1, 4)))

并完成它。

如果您必须使用列表推导,请替换list()调用:

[(x, y) for x, y in zip(['A', 'B', 'C'], range(1, 4))]

但这与内部列表理解一样多余。

您要做的是将单个元素传递给zip()函数,该函数只接受序列。

于 2013-07-13T13:37:18.413 回答
2

您实际上可以使用map()' 压缩传递的参数的能力:

>>> map(None, ['A','B','C'], range(1,4)) # For python 2.x only
[('A', 1), ('B', 2), ('C', 3)]

您的代码的错误在于它将数字传递给 zip 的第二个参数,而不是迭代器。

于 2013-07-13T13:38:19.063 回答
0

你也可以使用

>>> some_list = ['A', 'B', 'C']
>>> enumerate(some_list)

尽管这会以相反的顺序为您提供对,从零开始并且作为 Iterable 而不是列表(0, 'A'), (1, 'B'), (2, 'C')(尽管 Interable 通常更有效)。如果你想特别从 1 开始,你可以传入 start 值作为第二个参数枚举,之后你也可以转换为列表:

>>> list(enumerate(some_list, 1))
[(1, 'A'), (2, 'B'), (3, 'C')]

尽管如此,这仍然以与问题相反的顺序给出了对。

当您想要列表中的索引和元素时,此技术很常见:

>>> for i, c in enumerate('ABC'):
...     print i, c
...
0 A
1 B
2 C
于 2013-07-13T13:54:08.390 回答