蟒蛇。 “压缩”字符和列表的最佳方式

时间:2013-12-05 14:44:12

标签: python list char zip

我想在Python中“压缩”char和列表:

一个例子:

char = '<'
list = [3, 23, 67]

"zip"(char, list) 
 >>> [('<', 3), ('<', 23), ('<', 67)]

我如何使用 itertools.repeat()

itertools.izip(itertools.repeat(char, len(list)), list)
>>>[('<', 3), ('<', 23), ('<', 67)]

它有效,但找到更多的pythonic解决方案非常有趣。

5 个答案:

答案 0 :(得分:4)

[(char, i) for i in list]

将列表命名为“list”可能不是一个好主意,因为这会影响内部列表类型的构造函数。

答案 1 :(得分:4)

这里你不需要itertools。

使用列表理解:

>>> char = '<'
>>> lst = [3, 23, 67]
>>> [(char, n) for n in lst]
[('<', 3), ('<', 23), ('<', 67)]

顺便说一句,不要使用list作为变量名。它影响内置函数list

答案 2 :(得分:1)

如果char仅用于所有配对,只需使用列表理解:

>>> [(char, i) for i in lst]
[('<', 3), ('<', 23), ('<', 67)]

如果char是字符的字符串,并且您希望在配对时循环使用它们(如zip()用于最短的长度序列),请使用{{3 }}:

>>> from itertools import cycle
>>> chars = 'fizz'
>>> lst = range(6)
>>> zip(chars, lst)
[('f', 0), ('i', 1), ('z', 2), ('z', 3)]
>>> zip(cycle(chars), lst)
[('f', 0), ('i', 1), ('z', 2), ('z', 3), ('f', 4), ('i', 5)]

请注意字符串'fizz'的字符如何重复用于与数字45配对;它们将继续循环以匹配任何长度列表(必须是有限的)。

答案 3 :(得分:1)

如果你想要一些与你使用itertools相当的东西 - 使用延迟生成进行迭代 - 那么你可以使用生成器表达式。除了用括号括起表达式之外,语法几乎等同于列表推导。

>>> c = '<'
>>> l = [3, 23, 67]
>>> my_gen = ((c, item) for item in l)
>>> for item in my_gen:
...     print item
...
('<', 3)
('<', 23)
('<', 67)

有关详细信息,请参阅解释它的PEP:http://www.python.org/dev/peps/pep-0289/

答案 4 :(得分:1)

如果您真的想使用zip,请按以下步骤操作:

l  = [3, 23, 67]
zip('<' * len(l), l)

[('<', 3), ('<', 23), ('<', 67)]

更详细地说,itertools.repeat(char, len(list))'<' * 3的结果非常相似。另外,两者都使用zip(你也可以写zip(itertools.repeat(char, len(list)), l)))。

相关问题