我想在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解决方案非常有趣。
答案 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'
的字符如何重复用于与数字4
和5
配对;它们将继续循环以匹配任何长度列表(必须是有限的)。
答案 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))
)。