Python:返回列表中顺序出现的公共项的列表,以及不常见项的列表

Python:返回列表中顺序出现的公共项的列表,以及不常见项的列表,python,list,Python,List,有很多答案,所以一次只能列出两个列表。需要一个可以处理任意数量的列表,并返回两个列表 注:列表的顺序很重要,不包括集合。 注意:必须是每个列表中最低的常用项,而不是基于列表中的第一个列表。最简单的方法是使用集合,但您将失去顺序 lists = [[a,b,c,d],[a,b,c,d,e],[a,b,c,x],[a,b,c,d,e,f]....lots] common_items = [a,b,c] uncommon_items = [[d], [d,e], [x], [d,e,f]] com

有很多答案,所以一次只能列出两个列表。需要一个可以处理任意数量的列表,并返回两个列表

注:列表的顺序很重要,不包括集合。
注意:必须是每个列表中最低的常用项,而不是基于列表中的第一个列表。

最简单的方法是使用集合,但您将失去顺序

lists = [[a,b,c,d],[a,b,c,d,e],[a,b,c,x],[a,b,c,d,e,f]....lots]

common_items = [a,b,c]
uncommon_items = [[d], [d,e], [x], [d,e,f]]

common_elements(lists[0],lists[1])

def common_elements(list1, list2):
    return [element for element in list1 if element in list2]
集合是表示公共元素的最佳方式。您可以使用不同的列表来维护不常见元素的顺序

lists = [['a','b','c','d'],
         ['a','b','c','d','e'],
         ['a','b','c','x'],
         ['a','b','c','d','e','f']]

sets = map(set, lists)
common = set.intersection(*sets)
uncommon = [s-common for s in sets]
print common    # set(['a', 'c', 'b'])
print uncommon  # [set(['d']), set(['e', 'd']), set(['x']), set(['e', 'd', 'f'])]
假设
common
的元素在所有列表中以相同的顺序出现,则可以将公共集转换为列表

uncommon = [[x for x in l if x not in common] for l in lists]
print uncommon  # [['d'], ['d', 'e'], ['x'], ['d', 'e', 'f']]

此解决方案也保留了顺序

common = [x for x in lists[0] if x in common]
输出

common, uncommon = lists[0], lists[0]
for clist in lists:
    common = [item for item in common if item in clist]
uncommon = [[item for item in clist if item not in common] for clist in lists ]
print common, uncommon
根据OP在评论中的要求编辑:

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

我会这样做的

代码:

common = lists[0]
from itertools import takewhile
for l1, l2 in zip(lists, lists[1:]):
    common = [i[0] for i in takewhile(lambda i: i[0] == i[1] == i[2], zip(l1, l2, common))]
uncommon = [clist[len(common):] for clist in lists]
print common, uncommon
输出:

def lcs(l,key=None):
    if key==None: key=min(l,key=len)
    t = [x for x in l if key in x]
    return key if t == l else lcs(l,key[:-1])

if __name__=='__main__':
    lists = [['a','b','c','d'],
             ['a','b','c','d','e'],
             ['a','b','c','x'],
             ['a','b','c','d','e','f']]

    l = [''.join(item) for item in lists]
    print lcs(l)  
我不太了解复杂性之类的东西,但是这段代码可以解决这个问题


希望这有帮助:)

到目前为止,您的代码是…?顺序对我来说很重要。公共物品的顺序很重要,因为
列出了所有维护顺序的物品,返回结果的顺序很重要。通过从集合到有序列表的转换进行编辑。非常好,但与前面的答案相同,它似乎没有返回最低的公共元素。例如,它给了我[a,b,c,d]作为公共,它应该是[a,b,c]@ilovpython它只返回你在问题中提供的输入数据
['a','b','c']
,['a','b','c','d','d','e','f']>>>第二代最低通用项(列表)['a','b','c','d'],['a','b','c','d','d','e','f']
a,b,c,d`不是按顺序出现的最低通用项。顺序很重要,我希望
a,b,c
@ILovePython终于明白你说的了。现在检查我的答案。
abc