Python - 将列表转换为包含唯一组合的列表,每个条目都包含在其中

2024-03-28 14:38:11 发布

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

我的清单如下:

mylist=[[a,b],[a,c],[b,c],[c,d],[d,e],[e,c]]

我想做的是遍历mylist并生成一个新列表,如下所示:

result=[ [ [a,b],[c,d] ] , [ [a,c],[d,e] ] , [ [b,c] ], [ [e,c] ] ]

换言之,制作一个列表列表,其中每个列表包含初始列表条目的唯一组合,这样一个字母就不会在结果列表的每个条目中出现两次。此外,每次向结果添加条目时,我们都会从初始列表的可用组合集中提取其子元素。(我想给出的例子比解释更清楚)。你知道吗


Tags: 目的元素列表字母条目result例子mylist
3条回答

代码:

mylist=[['a','b'],['a','c'],['b','c'],['c','d'],['d','e'],['e','c']]
#- Get Length of mylist which is used in 2nd for loop to iterate items from next item to last item
len_mylist = len(mylist)
#- Final Result Will store in following variable.
output = []
#- this is Index of item which already present in Output List.
remove_index = []

# Iterate every item from mylist with his Index.
for i, item in enumerate(mylist):

    tmp = []
    #- Check item is already present in Remove List of not.
    if i in remove_index:
        continue

    #- Add index to Remove list and add item to tmp which is item in otput list.
    remove_index.append(i)
    tmp.append(item)
    #- Iterate from Next item to last item of mylist.
    for j in range(i+1, len_mylist):
        itemj = mylist[j]
        #- Set insert flag to True on which we are decide to insert item or not.
        inser_flag = True
        # Iterate on inner item 
        for tmp_item in tmp:
            #- Check next item letters already present or not.
            if tmp_item[0] in itemj or tmp_item[1] in itemj:
                inser_flag = False
                break
            #- Check item is already present in Remove List of not.
            if j in remove_index:
                inser_flag = False
                break

        #- Add item to inner item if Flag is True.
        if inser_flag:
            remove_index.append(j)
            tmp.append(itemj)
            break
    # append to Final Output
    output.append(tmp)

输出:

>>> output
[[['a', 'b'], ['c', 'd']], [['a', 'c'], ['d', 'e']], [['b', 'c']], [['e', 'c']]]

也许您可以尝试使用zip

mylist=[['a','b'],['a','c'],['b','c'],['c','d'],['d','e'],['e','c']]

print zip(mylist[:len(mylist)/2],mylist[len(mylist)/2:])

结果:

[(['a', 'b'], ['c', 'd']), (['a', 'c'], ['d', 'e']), (['b', 'c'], ['e', 'c'])]

如果要迭代结果,只需使用for i in zip(),或者可以将元组转换为列表:

print [list(i) for i in zip(mylist[:len(mylist)/2],mylist[len(mylist)/2:])]

输出:

[[['a', 'b'], ['c', 'd']], [['a', 'c'], ['d', 'e']], [['b', 'c'], ['e', 'c']]]

或者只使用列表:

print [[mylist[i],mylist[i+len(mylist)/2]] for i in range(len(mylist)/2)]

这应该适合您:

mylist=[['a','b'],['a','c'],['b','c'],['c','d'],['d','e'],['e','c']]
final_res=[]
while(len(mylist)>0):
    res=[list(mylist[0])]
    mylist.remove(res[0])
    for l in mylist:
        if len(set(l) & set().union(*res))==0:
            res.append(l)
            mylist.remove(l)
    final_res.append(res)

输出:

print final_res
>> [[['a', 'b'], ['c', 'd']], [['a', 'c'], ['d', 'e']], [['b', 'c']], [['e', 'c']]]

相关问题 更多 >