如何找到重复的列表值?

2024-06-28 20:01:04 发布

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

我有一个不寻常的任务。数据:

[(1566767777.0, 'Aaron Paul', 'dorety1', 'sfp_names', 'HUMAN_NAME', 100, 100, 0, '8ff7', '08f3', 'Human Name', 'ENTITY', '19fd', 0, 0),
 (1566767863.0, 'Aaron Paul', "{'username': 'aaronpaul', 'last_name': 'Paul', 'friends_count': 509, 'is_group': False, 'is_active': True, 'trust_request': None, 'phone': None, 'profile_picture_url': 'http, 'is_blocked': False, 'id': '1690', 'identity': None, 'date_joined': '2015-05-22T18:58:12', 'about': ' ', 'display_name': 'Aaron Paul', 'first_name': 'Aaron', 'friend_status': None, 'email': None}", 'sfp_names', 'HUMAN_NAME', 100, 100, 0, '7049', 'a458', 'Human Name', 'ENTITY', '19fd', 0, 0),
 (1566, 'Aaron Paul', 'Possible full name: Aaron Paul', 'sfp_names', 'HUMAN_NAME', 100, 100, 0, '6685', '235f', 'Human Name', 'ENTITY', '19fd', 0, 0),
 (1566767503.0, 'Antoine Griezmann', 'dorety', 'sfp_names', 'HUMAN_NAME', 100, 100, 0, '16ab', '08f3', 'Human Name', 'ENTITY', '19fd', 0, 0),
 (1566767108.0, 'Boris Johnson', 'dorety', 'sfp_names', 'HUMAN_NAME', 100, 100, 0, '7931', '08f3', 'Human Name', 'ENTITY', '19fd', 0, 0)]

我需要从[1]被复制而[3]不被复制的turples中获取值。也就是说,在上面的数据中,我们总是有相同的[3](sfp\U名称),在[1](Aaron Paul)的几个结果中,也就是说,从这个列表中,我们应该只得到(1566767777.0, 'Aaron Paul', 'dorety1' , 'sfp_names', 'HUMAN_NAME', 100, 100, 0, '8ff7', '08f3', 'Human Name', 'ENTITY', '19fd', 0, 0)和另外两个名为Aaron Paul的结果。因为我们通常在它出现的列表数量上没有区别。我们需要从这三个列表中获得相同的值[['Aaron Paul', 'sfp_names']]。但是如果我们有第三个模块名为sfp\u names\u2的turple,那么我们需要已经得到两个值,因为模块是不同的。[['Aaron Paul', 'sfp_names'], ['Aaron Paul', 'sfp_names_2']]。你知道吗

关于我自己所做的,我没有想到这一部分;我只是有办法在清单中找到重复的内容。你知道吗

我明白我所描述的很难理解,所以我在下面给出了一些简单的例子来说明它应该如何工作

简单版本

数据:

[(0, 'Boby', 'beekeeper'), (1, 'Boby', 'beekeeper'), (2, 'Boby', 'beekeeper'), (3, 'Boby', 'gardener')]

结果:

['Boby', 'beekeeper']

或者

数据:

[(0, 'Boby', 'beekeeper'), (1, 'Boby', 'beekeeper'), (2, 'Boby', 'beekeeper'), (3, 'Boby', 'gardener'), (4, 'Boby', 'gardener'), (5, 'Jack', 'gardener')]

结果:

[['Boby', 'beekeeper'], ['Boby', 'gardener']]

Tags: 数据namenonenamesentitygardenerhumanaaron
2条回答

如果我正确理解了您的问题,那么您希望从一个元组列表中获取所有元组,这些元组对于元组的某个特定元素具有重复值,但是只希望保留那些对于元组的其他特定元素具有不同值的重复组?你知道吗

如果是这样的话,我很抱歉地说你没有很好地解释这一点,我提到这一点是因为对一个问题有一个清晰的理解,这样你就可以用几句话来解释它,这也是编写代码的第一步。你知道吗

示例数据:

[('a', 1, 0), ('a', 2, 0), ('b', 1, 0), ('c', 1, 0), ('c', 1, 0)]

在本例中,假设您正在查看第1个(索引0)和第2个(索引1)元素,我希望您希望得到[('a', 1, 0), ('a', 2, 0)]。不包括带有'b'的元组是因为没有秒,不包括带有'c'的元组是因为有秒,但是它对于其他元素没有不同的值。你知道吗

第二个例子

('d', 1, 0), ('d', 2, 0), ('d', 2, 1)]

这里显示了一些您没有提到的内容。它们应该包括在内,因为第一个元素对所有元素都是相同的,而第二个元素不是相同的,但是应该包括所有三个元素,还是只包括第二个元素的2元组中的一个(随机的,或者第一个)?我想你会想要所有的,因为它们符合你的前两个标准。你知道吗

from itertools import groupby

data = [('a', 1, 0), ('a', 2, 0), ('b', 1, 0), ('c', 1, 0), ('c', 1, 0)]


def my_filter(el1, el2, xs):
    return [e for l in [list(g) for k, g in groupby(xs, lambda x: x[el1])]
            for e in l if len(set([e[el2] for e in l])) > 1]


print(my_filter(0, 1, data))

我不完全确定我是否正确理解你:

你想得到一个列表的所有元素(元组),这些元素的条目集合在你的列表中多次出现?!你知道吗

如果将itertools.groupbyoperator.itemgetter结合起来,就可以实现紧凑的实现。这实际上会产生一个一行表达式:

from operator import itemgetter
from itertools import groupby

# how often must the pattern appear (redundancy)
# what indices determine the pattern (target_slots)
redundancy, target_slots = 2, (1, 2)

eg_data_2 =  [(0, 'Boby', 'beekeeper'), (1, 'Boby', 'beekeeper'), (2, 'Boby','beekeeper'), (3, 'Boby', 'gardener'), (4, 'Boby', 'gardener'), (5, 'Jack', 'gardener')]

targets = [k for k, v in groupby(eg_data_2, itemgetter(*target_slots)) if sum(1 for _ in v)>=redundancy]

targets
Out[6]: [('Boby', 'beekeeper'), ('Boby', 'gardener')]

对于原始数据(orig_data如下),您将得到:

target_slots = [1,3]
targets = [k for k, v in groupby(orig_data, itemgetter(*target_slots)) if sum(1 for _ in v)>=redundancy]

In [9]: targets                                                           
Out[9]: [('Aaron Paul', 'sfp_names')]


作为替代方法,您可以单独使用itemetter操作符。其思想是将元素集合用作键,其值是该特定集合所在的元素索引列表。然后,如果此列表长于您选择的任何阈值(下面的redundancy参数),我们将报告此特定集合:

from operator import itemgetter
from collections import defaultdict

# how many times must the collection of elements appear
redundancy = 2
# what are the indices of the collection
target_slots = [1, 2] 

# the example data:
eg_data_2 =  [(0, 'Boby', 'beekeeper'), (1, 'Boby', 'beekeeper'), (2, 'Boby','beekeeper'), (3, 'Boby', 'gardener'), (4, 'Boby', 'gardener'), (5, 'Jack', 'gardener')]


occurences = defaultdict(list)  # this is just convenient, you can use a normal dict as well.
for i, entry in enumerate(eg_data_2):
    occurences[itemgetter(*target_slots)(entry)].append(i)
targets = [k for k,v in occurences.items() if len(v) >=redundancy]
targets
Out[18]: [('Boby', 'beekeeper'), ('Boby', 'gardener')]

如果希望返回元素而不是重复的条目,则需要稍微调整targets的语句,因为sum(1...将已经使用组迭代器。你知道吗

下面是它的样子:

from operator import itemgetter
from itertools import groupby

redundancy, target_slots = 2, (1, 2)

eg_data_2 =  [(0, 'Boby', 'beekeeper'), (1, 'Boby', 'beekeeper'), (2, 'Boby','beekeeper'), (3, 'Boby', 'gardener'), (4, 'Boby', 'gardener'), (5, 'Jack', 'gardener')]

_targets = [(k, [e for e in v]) for k, v in groupby(eg_data_2, itemgetter(*target_slots))]
targets = [tg[1] for tg in _targets if len(tg[1]) >= redundancy]

这将提供:

[ins] In [6]: targets                                                           
Out[6]: 
[[(0, 'Boby', 'beekeeper'),
  (1, 'Boby', 'beekeeper'),
  (2, 'Boby', 'beekeeper')],
 [(3, 'Boby', 'gardener'), (4, 'Boby', 'gardener')]]

相关问题 更多 >