如何遍历列表,获取每对可能的值?
how to iterate through the list, fetching each possible pair of values?
我如何遍历 list
(数字)并获取每对可能的值?
示例(java):
for(int i = 0; i < 5; i++)
for(int j = i+1; j < 5; j++)
print(i, j); // 01, 02, 03, 04, 12, 13, 14, 23, 24, 34
我的问题是列表是通过生成器函数获取的,因此它是惰性的。此外,它可能非常大,因此将所有对保存在内存中不仅仅是绝望的解决方案。
所以最后一个问题 - 如何在 python 中实现相同的行为,记住内存是有限的?此外,复杂性不应超过 O(N^2)
,其中 N
是 list
.
的长度
您可以使用 itertools.combinations
:
list(itertools.combinations(range(5), 2))
Out[7]:
[(0, 1),
(0, 2),
(0, 3),
(0, 4),
(1, 2),
(1, 3),
(1, 4),
(2, 3),
(2, 4),
(3, 4)]
或者从成对中生成字符串:
[''.join(str(i) for i in p) for p in itertools.combinations(range(5), 2)]
Out[8]: ['01', '02', '03', '04', '12', '13', '14', '23', '24', '34']
其实你想要组合,你可以使用itertools.combinations
函数:
>>> from itertools import combinations
>>> list(combinations(range(5),2))
[(0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
如果您想连接结果,您可以将元素转换为字符串,然后 join
它们 :
>>> [''.join(map(str,i)) for i in combinations(range(5),2)]
['01', '02', '03', '04', '12', '13', '14', '23', '24', '34']
此外,作为获得预期输出的更有效方式,您可以使用包含从 0 到 5 的所有数字的字符串:
>>> from string import digits
>>> [''.join(i) for i in combinations(digits[:5],2)]
['01', '02', '03', '04', '12', '13', '14', '23', '24', '34']
我认为我们都忽略了最简单的解决方案...
from itertools import combinations
for x in combinations(range(5), 2):
print x
试试这个
from itertools import combination
>>>[''.join(map(str, i)) for i in combinations(range(5), 2)]
['01', '02', '03', '04', '12', '13', '14', '23', '24', '34']
像这样(没有库):
lst = [0, 1, 2, 3, 4]
newlst = [(y,z) for y in lst for z in lst]
output = set(['%s%s' % (x[0], x[1]) for x in newlst])
或者,作为一行(即不可读):
set(['%s%s' % (x[0], x[1]) for x in [(y, z) for y in lst for z in lst]])
我如何遍历 list
(数字)并获取每对可能的值?
示例(java):
for(int i = 0; i < 5; i++)
for(int j = i+1; j < 5; j++)
print(i, j); // 01, 02, 03, 04, 12, 13, 14, 23, 24, 34
我的问题是列表是通过生成器函数获取的,因此它是惰性的。此外,它可能非常大,因此将所有对保存在内存中不仅仅是绝望的解决方案。
所以最后一个问题 - 如何在 python 中实现相同的行为,记住内存是有限的?此外,复杂性不应超过 O(N^2)
,其中 N
是 list
.
您可以使用 itertools.combinations
:
list(itertools.combinations(range(5), 2))
Out[7]:
[(0, 1),
(0, 2),
(0, 3),
(0, 4),
(1, 2),
(1, 3),
(1, 4),
(2, 3),
(2, 4),
(3, 4)]
或者从成对中生成字符串:
[''.join(str(i) for i in p) for p in itertools.combinations(range(5), 2)]
Out[8]: ['01', '02', '03', '04', '12', '13', '14', '23', '24', '34']
其实你想要组合,你可以使用itertools.combinations
函数:
>>> from itertools import combinations
>>> list(combinations(range(5),2))
[(0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
如果您想连接结果,您可以将元素转换为字符串,然后 join
它们 :
>>> [''.join(map(str,i)) for i in combinations(range(5),2)]
['01', '02', '03', '04', '12', '13', '14', '23', '24', '34']
此外,作为获得预期输出的更有效方式,您可以使用包含从 0 到 5 的所有数字的字符串:
>>> from string import digits
>>> [''.join(i) for i in combinations(digits[:5],2)]
['01', '02', '03', '04', '12', '13', '14', '23', '24', '34']
我认为我们都忽略了最简单的解决方案...
from itertools import combinations
for x in combinations(range(5), 2):
print x
试试这个
from itertools import combination
>>>[''.join(map(str, i)) for i in combinations(range(5), 2)]
['01', '02', '03', '04', '12', '13', '14', '23', '24', '34']
像这样(没有库):
lst = [0, 1, 2, 3, 4]
newlst = [(y,z) for y in lst for z in lst]
output = set(['%s%s' % (x[0], x[1]) for x in newlst])
或者,作为一行(即不可读):
set(['%s%s' % (x[0], x[1]) for x in [(y, z) for y in lst for z in lst]])