Python 查找多个字典键的模式

Python 查找多个字典键的模式,python,dictionary,key,mode,Python,Dictionary,Key,Mode,我目前有一个Python字典,其中的键分配给多个值(来自CSV),格式类似于: { 'hours': ['4', '2.4', '5.8', '2.4', '7'], 'name': ['Adam', 'Bob', 'Adam', 'John', 'Harry'], 'salary': ['55000', '30000', '55000', '30000', '80000'] } (实际字典的键和值都要大得多。) 我希望找到每一组值的模式*,规定所有值只出现一次的集合不需要模式。然而,我不知道

我目前有一个Python字典,其中的键分配给多个值(来自CSV),格式类似于:

{
'hours': ['4', '2.4', '5.8', '2.4', '7'],
'name': ['Adam', 'Bob', 'Adam', 'John', 'Harry'],
'salary': ['55000', '30000', '55000', '30000', '80000']
}
(实际字典的键和值都要大得多。)

我希望找到每一组值的模式*,规定所有值只出现一次的集合不需要模式。然而,我不知道如何进行(我也找不到任何其他类似的例子)。我还关心每一组值的不同(隐含)数据类型(例如,“小时”值是浮动,“名称”值是字符串,“工资”值是整数),尽管我包含了一个基本的转换函数,但尚未使用

import csv

f = 'blah.csv'

# Conducts type conversion
def conversion(value):
    try:
        value = float(value)
    except ValueError:
        pass
    return value

reader = csv.DictReader(open(f))

# Places csv into a dictionary
csv_dict = {}
for row in reader:
    for column, value in row.iteritems():
        csv_dict.setdefault(column, []).append(value.strip())
*我也想尝试其他类型的计算,比如平均值和四分位数——这就是我关心数据类型的原因——但我现在最希望的是模式方面的帮助


编辑:输入的CSV文件可以更改;我不确定这是否对潜在的解决方案有任何影响。

我不确定我是否理解这个问题,但您可以手动创建一个字典,将每个所需模式与这些键匹配,或者您可以通过询问值使用“type”类,然后如果类型返回字符串,请询问其他问题/参数,类似于项目的长度。

忽略所有与您的问题相关的csv文件内容,假设您有一个列表
工资
。您可以使用
collections
中的类来计算唯一的列表元素

因此,关于如何从
计数器进入您的模式,您有许多不同的选项

例如:

from collections import Counter

salary = ['55000', '30000', '55000', '30000', '80000']

counter = Counter(salary)

# This returns all unique list elements and their count, sorted by count, descending
mc = counter.most_common()
print(mc)

# This returns the unique list elements and their count, where their count equals
#   the count of the most common list element.
gmc = [(k,c) for (k,c) in mc if c == mc[0][1]]
print(gmc)

# If you just want an arbitrary (list element, count) pair that has the most occurences
amc = counter.most_common()[0]
print(amc)
对于代码中的
薪资
列表,这将输出:

[('55000', 2), ('30000', 2), ('80000', 1)] # mc [('55000', 2), ('30000', 2)] # gmc ('55000', 2) # amc [('55000',2),('30000',2),('80000',1)]#mc [('55000',2),('30000',2)]#gmc ('55000',2)#amc
当然,对于您的情况,您可能会使用
计数器(csv_dict[“salary”])
而不是
计数器(salary)

模式不明确,您想要所有模式还是任何模式?例如,如果有多个项目具有相同的重复次数(最大重复次数),是否全部返回?还是随便一个?或者没有?如果我理解正确的话,我相信我的答案是“全部”。我举的例子是,返回2.4表示小时,返回Adam表示姓名,返回55000和30000表示薪水。我理解你的问题了吗?不,我是说一把钥匙。例如,如果小时数为[4,4,4,6,6],您应该返回4还是[4,6]作为模式?对于单个键,它应该返回[4,6]——但仅当它们出现多次时才返回。如果小时本身是[4,6],它应该什么也不返回;[1,2,3,4,5,6,7,8]也不会返回任何内容。我突然想到,我没有指定可能的输入CSV是否会更改-它可以。这会改变你的答案吗?我是否应该以某种方式重复列标题,其中您已经编写了
counter=counter(salary)
(其中
salary
将发生变化)?@Auhsoj100是的,这就是我在回答的最后一部分所建议的,您可能想要类似
counter(csv_dict[“salary”])
的内容,而不是
counter(salary)
我的印象是,我不能硬编码
计数器(csv_dict[“salary”])
,因为csv输入可以更改(因此键/csv标题,例如“salary”也可以更改)。我有什么误解吗?@Auhsoj100不,你没有。如果标题也可以更改,您希望将标题作为变量传递到
csv\u-dict
(例如
计数器(csv\u-dict[some\u-header])
)。可能循环通过可能的头,如:
对于所有头中的某些头:Counter(csv\u dict[some\u header])
好的,这似乎是一个很好的可能路径。我看看我该怎么做,谢谢。