如何在Python中运行i<j循环,如果(i,j)已经完成,则不重复(j,i)?

2024-06-16 09:32:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图实现一个“I not equal to j”(i<j)循环,它跳过了i = j的情况,但是我想进一步提出一个额外的要求,即如果已经完成了(i,j)的排列,循环就不会重复(j,i)的排列(因为,由于对称性,这两种情况给出了相同的解决方案)

第一次尝试

在下面的代码中,我通过迭代以下列表来进行i<j循环,其中第二个列表只是前滚的第一个列表1:

mylist = ['a', 'b', 'c']
np.roll(mylist,2).tolist() = ['b', 'c', 'a']

下面代码生成的序列不是我想要的:

import numpy as np

mylist = ['a', 'b', 'c']
for i in mylist:
    for j in np.roll(mylist,2).tolist():
        print(i,j)

由于它返回一个重复的a a,并且具有重复的a bb a排列:

a b
a c
a a
b b
b c
b a
c b
c c
c a

所需的序列应该是mylist中元素的成对组合,因为对于N=3元素,应该只有N*(N-1)/2 = 3对可以循环:

a b
a c
b c

Tags: toin元素列表fornpnot情况
2条回答

您可以使用list.insert来帮助进行左移和右移

list.pop,从原始列表中删除元素并返回它list.insert将返回的元素添加到给定索引处的列表中(本例中为0或-1)。注意:此操作已就位

#Left shift
mylist = ['apples', 'guitar', 'shirt']
mylist.insert(-1,mylist.pop(0))
mylist

### ['guitar', 'apples', 'shirt']
#Right shift
mylist = ['apples', 'guitar', 'shirt']
mylist.insert(0,mylist.pop(-1))
mylist

### ['shirt', 'apples', 'guitar']

更好的方法是使用collections.deque。这将允许您使用多个班次,并且还可以使用其他一些整洁的队列功能

from collections import deque

mylist = ['apples', 'guitar', 'shirt']
q = deque(mylist)
q.rotate(1)       # Right shift ['shirt', 'apples', 'guitar']
q.rotate(-1)      # Left shift ['guitar', 'shirt', 'apples']
q.rotate(3)       #Right shift of 3 ['apples', 'guitar', 'shirt']

编辑:根据您的评论,您正在尝试获得排列-

from itertools import product
[i for i in product(l, repeat=2) if len(set(i))>1]
[('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]

out = []
for i in l:
    for j in l:
        if len(set([i,j]))>1:
               print(i,j)
a b
a c
b a
b c
c a
c b

只需删除第一个元素并附加它,您就可以使用相当粗糙的方法来实现这一点:

mylist.append(mylist.pop(0))

其中.append(...)将一个元素附加到列表的末尾,而.pop(...)将从给定索引中删除一个元素并返回它

相关问题 更多 >