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