存储某个值在列表内的多个列表中重复到dict的次数

Dan*_*era 0 python dictionary python-3.x

我试图在列表中的多个列表中获取第一个值,并存储它重复多少次,如果它不止一次进入字典/哈希.

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']
    ]
Run Code Online (Sandbox Code Playgroud)

当我尝试以下内容时:

my_dict = {row[0]:coordinates.count(row[0]) for row in coordinates}
Run Code Online (Sandbox Code Playgroud)

价值my_dict成为:

{'sj1955': 0, 'bg1955': 0}
Run Code Online (Sandbox Code Playgroud)

代替:

{'bg1955': 3}
Run Code Online (Sandbox Code Playgroud)

我如何在python3中获得上述内容?原始数据样本在一个列表中将有超过20,000个列表,而不是上面列出的4个列表.

编辑:当我提到时certain,我的意思是每一行中的特定位置是行[0],而不仅仅是在字典中返回1个结果.如果有多个不同的值重复,它会导致这个,因为我想存储任何重复的值,让我们说如果sw1950在20个列表中并且jb1994在393个列表中它将是:

{'bg1955': 3, 'sw1950': 20, 'jb1994': 393}
Run Code Online (Sandbox Code Playgroud)

Aja*_*234 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)
Run Code Online (Sandbox Code Playgroud)

输出:

{'sj1955': 1, 'bg1955': 3}
Run Code Online (Sandbox Code Playgroud)

使用柜台:

new_vals = map(list, zip(*coordinates))

print Counter(new_vals[0])
Run Code Online (Sandbox Code Playgroud)


cs9*_*s95 5

您现有方法不起作用的原因是您尝试这样做:

>>> x = [[1, 1, 1]]
>>> x.count(1)
Run Code Online (Sandbox Code Playgroud)

现在,您认为这将返回,3因为1存在3次.但是,这是它返回的内容:

0
Run Code Online (Sandbox Code Playgroud)

原因是因为这些元素位于嵌套列表中,并且.count()不计算嵌套元素.

将上述内容与此对比:

>>> x = [1, 1, 1]
>>> x.count(1)
3
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为那些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)
Run Code Online (Sandbox Code Playgroud)

输出:

Counter({'bg1955': 3, 'sj1955': 1})
Run Code Online (Sandbox Code Playgroud)

现在,您可以自由地查询此dict,了解您喜欢的任何项目的数量.如果要提取重复项,可以执行以下操作:

print({ k : count[k] for k in count if count[k] > 1})
Run Code Online (Sandbox Code Playgroud)

这打印{'bg1955': 3}.

  • 大声笑.我正准备用"计数器"粘贴这个确切的一个.+1 (2认同)
  • @idjaw我可以理解你选择赞成别人的答案,而不是发布没有附加价值的同一件事.小费我的帽子给你. (2认同)