以特定模式循环遍历列表

时间:2016-07-13 10:23:51

标签: python

我想迭代一个看起来像的列表 列表= [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方式来执行它吗?

4 个答案:

答案 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所建议的指数和范围。