我试图抓住列表中多个列表中的第一个值,并存储它重复多少次,如果它不止一次进入字典/散列。
coordinates = [
['bg1955', '47.6740° N', '122.1215° W'],
['bg1955', '47.6101° N', '122.2015° W'],
['bg1955', '47.6062° N', '122.3321° W'],
['sj1955', '37.3318° N', '122.0312° W']
]
当我尝试以下操作时:
my_dict = {row[0]:coordinates.count(row[0]) for row in coordinates}
my_dict
的值变为:
{'sj1955': 0, 'bg1955': 0}
而不是:
{'bg1955': 3}
我如何在python3中获得上述内容?原始数据样本在一个列表中有超过20,000个列表,而不是上面列出的4个。
编辑:
当我提到certain
时,我的意思是每行中特定的位置是row [0],而不仅仅是在字典中返回1个结果。如果有多个不同的值重复,那么就会导致这种情况,因为我希望存储任何重复的值,假设sw1950在20个列表中并且jb1994在393个列表中它将是:
{'bg1955': 3, 'sw1950': 20, 'jb1994': 393}
答案 0 :(得分:5)
您可以使用defaultdict:
from collections import defaultdict
d = defaultdict(int)
coordinates = [
['bg1955', '47.6740° N', '122.1215° W'],
['bg1955', '47.6101° N', '122.2015° W'],
['bg1955', '47.6062° N', '122.3321° W'],
['sj1955', '37.3318° N', '122.0312° W']
]
for i in coordinates:
d[i[0]] += 1
print dict(d)
输出:
{'sj1955': 1, 'bg1955': 3}
使用Counter:
new_vals = map(list, zip(*coordinates))
print Counter(new_vals[0])
答案 1 :(得分:5)
您现有方法不起作用的原因是您尝试这样做:
>>> x = [[1, 1, 1]]
>>> x.count(1)
现在,您认为这将返回3
,因为1存在3次。但是,这就是它的回报:
0
原因是因为这些元素位于嵌套列表中,.count()
不计算嵌套元素。
将上述内容与此对比:
>>> x = [1, 1, 1]
>>> x.count(1)
3
这是有道理的,因为那些1
不在嵌套列表中。
一种解决方法是使用collections.Counter
:
from collections import Counter
coordinates = [
['bg1955', '47.6740° N', '122.1215° W'],
['bg1955', '47.6101° N', '122.2015° W'],
['bg1955', '47.6062° N', '122.3321° W'],
['sj1955', '37.3318° N', '122.0312° W']
]
count = Counter()
for coord in coordinates:
count[coord[0]] += 1
print(count)
输出:
Counter({'bg1955': 3, 'sj1955': 1})
现在,您可以自由地查询此dict,了解您喜欢的任何项目的计数。如果要提取重复项,可以执行以下操作:
print({ k : count[k] for k in count if count[k] > 1})
这会打印{'bg1955': 3}
。
答案 2 :(得分:4)
>>> from collections import Counter
>>> Counter(c[0] for c in coordinates)
Counter({'bg1955': 3, 'sj1955': 1})
>>> dict(Counter(c[0] for c in coordinates)) # If you want dictionary, not Counter
{'bg1955': 3, 'sj1955': 1}
如果您只想获得重复的密钥计数,请在创建计数器后对其进行过滤。
>>> counts = Counter(c[0] for c in coordinates)
>>> {key: value for key, value in counts.items() if value > 1}
{'bg1955': 3}