查找多个字典键的模式

时间:2015-03-26 03:59:56

标签: 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']
}

(实际字典在键和值方面都要大得多。)

我希望找到每组值的模式*,其中规定设置所有值只出现一次不需要模式。但是,我不知道该怎么做(我找不到任何其他类似的例子)。我也关注每组值的不同(隐含)数据类型(例如'小时'值是浮点数,'名称'值是字符串,'工资'值是整数),虽然我有一个基本的转换函数包括但尚未使用。

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文件可以更改;我不确定这是否会对潜在的解决方案产生任何影响。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

关于如何从Counter进入您的模式,您有很多不同的选择。

例如:

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)

对于代码中的salary列表,输出:

[('55000', 2), ('30000', 2), ('80000', 1)]  # mc
[('55000', 2), ('30000', 2)]                # gmc
('55000', 2)                                # amc

当然,对于您的情况,您可能使用Counter(csv_dict["salary"])代替Counter(salary)