Python 计算元组列表中一个字段中的三元重复数

3

我有一个包含名字、姓和名的列表。

如何计算姓氏长度大于3的人数。

import collections

names = [['Fiona','Murray'],
['Diane','Springer'],
['Dylan','Oliver'],
['Alison','McDonald'],
['Sophie','Peters'],
['Kevin','Davidson'],
['David','Marshall'],
['Jake','Lewis'],
['Thomas','Burgess'],
['Fiona','Murray'],
['Fiona','Murray'],
['Fiona','Murray'],
['Fiona','Murray'],
['Dylan','Oliver'],
['Dylan','Oliver'] ]

lst1 = [(a,b) for (a,b) in collections.Counter(map(tuple,names)).iteritems()]

我尝试使用列表推导式,但无法获取姓氏长度大于3的人。

你想获取姓氏数量大于3的人的姓氏吗? - Anand S Kumar
是的,安纳德。那就是我要找的。 - Newbie
你的计数器正在计算全名,而不是姓氏。你需要先分离出姓氏。 - njzk2
4个回答

3

您可以使用 collections.Counter

from collections import Counter
counter = Counter([item[1] for item in names])
keys = [key for key, value in counter.items() if value > 3]
print(keys)

将会打印:

['Murray']

2
更多的函数式编程方法。
from collections import Counter
from operator import itemgetter
from itertools import imap

[(name, count) for name, count in Counter(imap(itemgetter(1), names)).iteritems() if count > 3]

感谢您的方法。 - Newbie
我并不真正看到使用imap的意义,因为(name[1] for name in names)可以做同样的事情,并且更易于阅读。 - njzk2

1
首先,您在collections.Counter中使用了完整的元组(名字和姓氏),但是为了达到您想要的效果,您需要仅使用每个内部列表的第二个元素(而不是将完整的内部列表转换为元组)。
其次,在列表推导式中没有检查计数是否大于3的条件。您应该检查b是否大于3。
例如 -
>>> lst1 = [(a,b) for (a,b) in collections.Counter([a[1] for a in names]).iteritems() if b > 3]
>>> lst1
[('Murray', 5)]

明白了,谢谢你澄清。 - Newbie

1
lst1=[entry[0] for entry in collections.Counter(map(tuple,names)).iteritems() if entry[1]>3]

"并且对于计数,只需在其前面放置len()。"

这正是我正在寻找的。 - Newbie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接