在列表列表中查找重复元素

2021-03-01 02:39:10 发布

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

我正在寻找Python对于以下问题的想法。在

给出一份名单。。。在

[[20, 21, 22], [17, 18, 19, 20], [10, 11, 12, 13]]

如果在任何或所有列表之间存在重复的元素,则返回True。如果所有元素都是唯一的,则返回False。在

在上面的示例中,20是常见的,并将返回True。下面的示例将返回False,因为列表中的所有数字都是唯一的。在

^{pr2}$

最后,不需要测试单个列表中的重复项,因为数字总是连续的。在

仅供参考-此问题将用于优化航空公司机组人员的每月日程安排。每个列表代表3天、4天或5天的航空旅行,不能重叠。在

顺便说一句-这个问题不是一个任务,而是一个个人追求少工作,多拿薪水:)抱歉,不清楚。我尝试了一个蛮力的方法,但希望有一个更优雅的Python方法。我很感谢所有的回复,因为他们正在引导我进入Python编程的新领域。在

3条回答
网友
1楼 ·

如果您愿意放弃列表理解的优雅,可以执行以下操作:

seen, dups = set(), set()
for l in ll:
    dups = dups.union(seen.intersection(set(l)))
    seen = seen.union(set(l))

你的答案应该在dups。在

编辑

正如Steven Rumbalski下面指出的,set成员操作参数中的set是多余的(而且不必要的昂贵)。在

网友
2楼 ·
num = Counter(i for j in alist for i in j) # flatten list into a single dimension
dup = [k for k, v in num.items() if v > 1] # checks the dict for duplicate values
网友
3楼 ·

假设您正在寻找一个特定的目标(您的问题不清楚):

def find_dupe(lists, target):
    seen = set()
    for lst in lists:
        for item in lst:
            if item == target and item in seen:
                return True
            seen.add(item)

演示:

^{pr2}$

如果不是,那么可以简单地去掉item == target条件

def find_dupe(lists):
    seen = set()
    for lst in lists:
        for item in lst:
            if item in seen:
                yield item
            seen.add(item)

相关问题