Python 如何遍历列表,获取每一对可能的值?

Python 如何遍历列表,获取每一对可能的值?,python,list,iteration,generator,Python,List,Iteration,Generator,我如何遍历(数字)的列表,并获取其每一对可能的值 示例(java): for(int i=0;i

我如何遍历(数字)的
列表
,并获取其每一对可能的值

示例(java):

for(int i=0;i<5;i++)
对于(int j=i+1;j<5;j++)
打印(i,j);//01, 02, 03, 04, 12, 13, 14, 23, 24, 34
我的问题是列表是通过生成器函数获取的,因此它是惰性的。此外,它可能非常大,所以在内存中保留所有对不仅仅是一个绝望的解决方案


因此,最后一个问题是——如何在python中实现相同的行为,记住内存是有限的?此外,复杂性不应超过
O(N^2)
,其中
N
列表的长度

您可以使用
itertools进行此操作。组合

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.compositions

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']

实际上,如果需要组合,可以使用函数:

>>> 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(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
>>> 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(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 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']
试试这个

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']
像这样(没有库):

或者,作为一行(即不可读):

像这样(没有库):

或者,作为一行(即不可读):


你所说的每一对可能的值到底是什么意思?这对的预期格式是什么?你能添加一个输入和一个期望输出吗?我指的是无序的2元组值,在java示例中打印在注释中。你所指的每一对可能的值到底是什么意思?这对的预期格式是什么?你能添加一个输入和一个期望输出吗?我指的是无序的2元组值,在java示例中打印在注释中。为你干杯,为不过度迭代(ListifIt,ThanIterate)一个迭代器干杯。为你干杯,为不过度迭代(ListifIt,ThanIterate)一个迭代器干杯。这不会产生预期的输出,因为您的解决方案在2个位置(重复)上生成5个元素的所有排列。这不会产生预期的输出,因为您的解决方案在2个位置(重复)上生成5个元素的所有排列。