我想迭代一个看起来像的列表 列表= [1,2,3,4,5,6] 我的迭代模式应如下所示:
list1=[1,2,3,4,5,6]
list2 = list1.copy()
list2=list2[-1:]
for i in list1:
for j in list2:
print i
print j
list2=list2[-1:]
伪代码
str queryName = "ActivityListOpen";
int i, dbcount;
QueryBuildDataSource qbds;
Query query = new Query(queryName);
dbcount = query.dataSourceCount();
for (i = 1; i <= dbcount; i++)
{
qbds = query.dataSourceNo(i);
info(qbds.name());
}
我知道如何在循环中执行此操作但是有一种pythonic方式来执行它吗?
答案 0 :(得分:3)
我认为获得所需值的最有效方式(在性能和编程时间上)是通过使用Python标准库中的itertools.combinations
来生成具有单个循环的值对: / p>
for i, j in itertools.combinations(list1, 2):
print(i, j)
不需要任何手动切片或搞乱索引。并且它可能比嵌套循环更快,因为itertools.combinations
是用C语言编写的。
答案 1 :(得分:1)
您不需要复制列表。
调用它list
是一个坏主意。
这将做你想要的(几乎与输出中的空格不同):
l = [1, 2, 3, 4, 5, 6]
for i in range(0, len(l)-1):
print l[i],', /',','.join(map(str, l[i+1:]))
答案 2 :(得分:1)
使用两个循环的想法很好,但list2[-1:]
只保留最后一个元素。要解决此问题,您必须执行此操作:list2 = list2[1:]
或list2.pop()
。
但这些效率很低,因为它们会在外循环的每次迭代中创建列表的新副本。我建议只是操纵指数:
list1=[1,2,3,4,5,6]
for i in range(len(list1)):
for j in list1[i:]:
print list1[i]
print j
答案 3 :(得分:1)
您发布的代码并未实现您的目标。相反,使用这样的东西:
In [3]: my_list = [1,2,3,4,5,6]
In [4]: for i,e1 in enumerate(my_list[:-1]):
...: for e2 in my_list[i+1:]:
...: print(e1,e2)
...:
1 2
1 3
1 4
1 5
1 6
2 3
2 4
2 5
2 6
3 4
3 5
3 6
4 5
4 6
5 6
如果您担心复制,请使用islice
itertools
In [16]: from itertools import islice
In [17]: stop = len(my_list)
In [18]: for i, e1 in enumerate(islice(my_list, stop)):
....: for e2 in islice(my_list, i + 1, stop):
....: print(e1,e2)
....:
1 2
1 3
1 4
1 5
1 6
2 3
2 4
2 5
2 6
3 4
3 5
3 6
4 5
4 6
5 6
虽然,此时你可能只想使用像Valentin Lorentz所建议的指数和范围。