如何在两个列表中形成匹配元素的列表,包括重复项?

2024-05-23 23:25:09 发布

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

我有两个清单:

string1Elements = ['down', 'down', 'down', 'down']
string2Elements = ['down', 'down', 'right', 'down']

我想要形成两个列表共有的元素的列表,包括重复的元素。我想要的结果如下:

^{pr2}$

我想到的匹配方式如下:

0:状态如下:

string1Elements = ['down', 'down', 'down', 'down']
string2Elements = ['down', 'down', 'right', 'down']

两个列表大小相同,因此任意选择一个。如果列表的大小不同,则会选择较短的列表。在

1:获取string1Elements(所选列表)的第一个元素。此元素是否存在于string2Elements中?如果是,则将其附加到匹配列表中,并将其从string1Elementsstring2Elements中删除。在

string1Elements = ['down', 'down', 'down']
string2Elements = ['down', 'right', 'down']
matches         = ['down']

2:获取string1Elements的第一个元素。此元素是否存在于string2Elements中?如果是,则将其附加到匹配列表中,并从string1Elementsstring2Elements中删除它。在

string1Elements = ['down', 'down']
string2Elements = ['right', 'down']
matches         = ['down', 'down']

3:获取string1Elements的第一个元素。此元素是否存在于string2Elements中?如果是,则将其附加到匹配列表中,并从string1Elementsstring2Elements中删除它。在

string1Elements = ['down']
string2Elements = ['right']
matches         = ['down', 'down', 'down']

4:获取string1Elements的第一个元素。此元素是否存在于string2Elements中?如果是,则将其附加到匹配列表中,并从string1Elementsstring2Elements中删除它。在

string1Elements = ['down']
string2Elements = ['right']
matches         = ['down', 'down', 'down']

5:所有元素都检查过了。在


上面的过程只是解释如何处理重复元素。实际上我不想更改列表string1Elements和{}。在

我不认为集合可以以明显的方式使用,因为有重复的元素:

matches = list(set(string2Elements).intersection(string1Elements))

我用列表理解法做了一个快速测试:

matches = [element for element in string1Elements if element in string2Elements]

这两种方法都不够。我如何按照我描述的方式实现匹配?在


Tags: inright元素列表过程状态方式element
1条回答
网友
1楼 · 发布于 2024-05-23 23:25:09

您可以系统地从一个列表中弹出,如果它们匹配,则将其附加到结果列表中。因为您是从列表中弹出的,所以它不会与list1中的一个元素匹配到list2中的五个元素,因为它将被弹出。示例函数:

def intersect(a, b):
    if len(b) < len(a):  # iff b is shorter than a
        a, b = b, a      # swap the lists.
    b = b[:]  # To prevent modifying the lists
    return [b.pop(b.index(i)) for i in a if i in b]

用法:

^{pr2}$

这与OP在问题中解释的方法完全相同,只是它只从较短的列表中删除元素。
在多个列表上工作的一个可以实现如下所示

def multi_intersect(*args):
    if len(args) == 1:
        try:
            return multi_intersect(*args)
        except TypeError:
            pass
    inters = [item for sublist in args for item in sublist]
    for arg in args:
        inters = intersect(inters, arg)
    return inters

相关问题 更多 >