如何在不删除python中的元素的情况下更改同一元素在相邻列表中的出现情况?

2024-09-17 18:23:26 发布

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

我有两张单子 列表1=['A'、'B'、'C'] 列表2=['1','2','3'] 我需要一个长列表(由这两个列表组合),长度为'n',没有

  1. 任何连续的相同对[“A1”、“A1”、“C3”、“B2”、“B2”、…]
  2. 列表1的任何相同元素连续[“A1'、“A2'、”A3'、“B1'、“B2'、…]
  3. 列表2的任何相同元素连续['A1,'B1,'C1,'A2','B2',…]

我希望组合列表中的元素按任何顺序排列,但彼此之间没有重复项。换句话说,, 就像这个例子,, [‘A1’、‘B2’、‘C3’、‘A2’、‘B3’、‘C1’、‘A3’、‘B1’、‘C2’、‘A1’、‘B2’、‘C3’…]

谁能帮帮我吗。我正在寻找一个答案,因为2天

编辑:

我试过itertools方法产品

newlist=[n[0]+n[1]表示列表中的n(itertools.product(list1,list2))]

#这给出了我需要的元素的精确排列,但不是我希望的顺序

新列表=['a1'、'a2'、'a3'、'b1'、'b2'、'b3'、'c1'、'c2'、'c3']

#然后,我使用嵌套循环

#交换新列表中的连续元素对 对于枚举(新列表)中的ind,n: 当n==newlist[ind-1]时: 对于枚举(新列表)中的ind,n: 当n==newlist[ind-1]时: 新列表[ind-1],新列表[ind-2]=新列表[ind-2],新列表[ind-1]

#交换newlist中连续的list1元素 对于枚举(新列表)中的ind,n: 而n[0]==newlist[ind-1][0]: 对于枚举(新列表)中的ind,n: 而n[0]==newlist[ind-1][0]: 新列表[ind-1],新列表[ind-2]=新列表[ind-2],新列表[ind-1]

#交换newlist中连续的list2元素 对于枚举(新列表)中的ind,n: 而n[1]==newlist[ind-1][1]: 对于枚举(新列表)中的ind,n: 而n[1]==newlist[ind-1][1]: 新列表[ind-1],新列表[ind-2]=新列表[ind-2],新列表[ind-1]

显然,它可以很好地处理包含3个以上元素的列表。但不适用于长度分别为3和2的列表。


Tags: a2元素列表a1b2a3b1单子
3条回答
#declaring 2 lists
    x=['a','b','c']
    y=[str(n) for n in range(1,5)]


    li=[]
    #Creating the pairs by shuffling two lists
    if len(x)>len(y):
        for m in range(len(x)):
            for n in range(len(y)):
                li.append(x[m]+y[n-1])
                m-=1
    else:
        for m in range(len(y)):
            for n in range(len(x)):
                li.append(y[m]+x[n-1])
                m-=1

    def pair_check(li):
        for ind,val in enumerate(li):
            if li[ind]==li[ind-1] or li[ind][0]==li[ind-1][0] or li[ind][1]==li[ind-1][1]:
                return True

    def pair_swap(li):
        for ind,val in enumerate(li):
            while li[ind]==li[ind-1] or li[ind][0]==li[ind-1][0] or li[ind][1]==li[ind-1][1]:
                li[ind-len(x)],li[ind]=li[ind],li[ind-(len(x))]

    #functions that verifies and swaps the pairs in combined list
    while pair_check(li):
        pair_swap(li)

    print (li)
    #Now the list li contains the list satisfies all the 3 conditions.
#Join the given list
list(map("".join,(zip(["A", "B", "C"], ["1","2","3"]))))

# Given your list
l3=["A1","B1","C1","A2","B2"]
l2=["A1","A2","A3","B1","B2"]
l=["A1","A1","C3","B2","B2"]

# set() data structure ensure no duplicate
list(set(l))+list(set(l2))+list(set(l3))

# output should be:
# ['B2', 'C3', 'A1', 'B2', 'A3', 'A2', 'B1', 'A1', 'C1', 'B2', 'A2', 'B1', 'A1']

希望这有帮助

我已经找到了你想要的解决办法。jrook指出的一条评论显示了与此类似的讨论,但在他们的案例中,它没有检查以确保它遵循了您想要的所有参数。所以我继续写了一段代码

import itertools

list1 = ["A","B","C"]
list2 = ["1","2","3", "4"]

if len(list1) < len(list2):
    x = list1[:]
    list1 = list2
    list2 = x
    list3 = [zip(x,list2) for x in itertools.permutations(list1,len(list2))]
    new = []
    for lis in list3:
        for i in lis:
            new.append(i[1] + i[0])    

else:
    list3 = [zip(x,list2) for x in itertools.permutations(list1,len(list2))]
    new = []
    for lis in list3:
        for i in lis:
            new.append(i[0] + i[1])



final = []
final.append(new[0])
new = new[1:]

def add_to(new, final):
    if final[-1][0] != new[0][0] and final[-1][1] != new[0][1] and final[-1] != new[0]:
        final.append(new[0])
        new = new[1:]
    else:
        b = new[0]
        new = new[1:]
        new.append(b)

    return new, final



while new != []:
    new, final = add_to(new, final)


print(final)

变量final是一个列表,它将确保遵循您想要的所有规则,即:没有重复项,没有相同的连续字母或数字。希望这就是你想要的。我编辑了这个,所以现在你可以让第二个或第一个列表的长度更长,它会工作得很好

相关问题 更多 >