Python3仅基于索引的一个值对元组列表进行Uniquify

2024-05-16 02:49:51 发布

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

我发誓我是第一个搜索的,找到了很多“如果改编就可以工作”,但没有什么真正帮助我。我有一个元组列表,格式如下:

[('', 'noreply@bookfresh.com'), ('Andrea', 'andrea@aaa.com'), ('Your Book', 'noreply@bookfresh.com'), ..]

在本例中,它是一个元组列表,在所有索引中,第一个值是“Name”,第二个值是“Email”。而且这个列表还没有按任何特定的方式排序。你知道吗

我需要的是一个清晰易懂的方法(我不一定要找一个连我都看不懂的行文)来生成一个“非限定”列表,但要有以下规则/注意事项:

  • 只有在发现元组的第二个值的重复项时才删除元组(在本例中,它恰好是电子邮件地址,应该是“noreply@bookfresh.com“”)
  • 不要消除所有重复元组的实例。我需要保留一个,要保留的应该是第一个对象中len()最多的元组。(在这种情况下,在重复的元组中,它只保留元组('Your Book','noreply@bookfresh.com'). 你知道吗

在这个最小化的例子中,最终的输出是: 你知道吗

[('Andrea', 'andrea@aaa.com'), ('Your Book', 'noreply@bookfresh.com'), ..]

不管输出是否有序,因为我知道如何对未排序的元组列表进行排序。谢谢


Tags: namecom列表your排序email格式元组
3条回答

可能最简单的方法是使用如下集合:

L = [('', 'noreply@bookfresh.com'), ('Andrea', 'andrea@aaa.com'), ('Your Book', 'noreply@bookfresh.com'), ..]

emails = set()

result_L = []

for item in L:
    if item[1] in emails:
        # this email address is already seen
        continue

    result_L += [item]
    emails.add(item[1])

但是,如果您想保留最后一项,您可以使用它(最后,您可能希望反转result_L):

for i in reversed(L):
    # ...

还有很多其他的方法可以做到这一点。例如,考虑使用dict

result_dict = {}

for item in L:
    result_dict[item[1]] = item[0]

result_L = [(y, x) for (x, y) in result_dict.items()] 

方法1:收集所有的名字

如果我们想要的是最容易理解的版本,而不是最圆滑的,也许是类似的

pairs = [('', 'noreply@bookfresh.com'), ('Andrea', 'andrea@aaa.com'), ('Your Book', 'noreply@bookfresh.com')]

data = {}
for name, email in pairs:
    if email not in data:
        data[email] = []
    data[email].append(name)

output = [(email, max(data[email], key=len)) for email in data]

会有用的。这将问题分为两部分:以电子邮件地址为键,以可能的名称列表为值构建字典;循环遍历所有电子邮件地址并获取最长的名称。你知道吗

第一部分可以用setdefault压缩,例如

for name, email in pairs:
    data.setdefault(email, []).append(name)

但不是每个人都熟悉。你知道吗


方法2:排序并使其唯一

或者,我们可以一次按电子邮件和名称长度排序,然后从中构建一个字典,只保留最后一个键/值对:

>>> pairs.sort(key=lambda x: (x[1], len(x[0])))
>>> data = {v: k for k,v in pairs}
>>> [(v,k) for k,v in data.items()]
[('Andrea', 'andrea@aaa.com'), ('Your Book', 'noreply@bookfresh.com')]

你可以用第二个词条作为你的键来建立一个字典。词典有一个恰当的做法,即在其关键字中不包含任何重复项。如果在构建字典之前按第一个元素的长度排序,它将为您提供所需的内容:

your_list_sorted = sorted(your_list, key=lambda x: len(x[0]))
out = dict((v, k) for k, v in your_list_sorted)

如果您需要列表形式的输出,您可以通过out_list = list(out.items())来获得它。你知道吗

相关问题 更多 >