查找多个字典键的模式
Finding modes for multiple dictionary keys
我目前有一个 Python 字典,其中的键分配给多个值(来自 CSV),格式类似于:
{
'hours': ['4', '2.4', '5.8', '2.4', '7'],
'name': ['Adam', 'Bob', 'Adam', 'John', 'Harry'],
'salary': ['55000', '30000', '55000', '30000', '80000']
}
(实际字典在键和值方面都明显更大。)
我正在寻找每组值的模式*,规定所有值仅出现一次的位置不需要模式。但是,我不确定该怎么做(而且我找不到任何其他与此类似的示例)。我还担心每组值的不同(隐含)数据类型(例如 'hours' 值是浮点数,'name' 值是字符串,'salary' 值是整数),尽管我有包括但尚未使用的基本转换功能。
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' class ,那么如果类型 returns 一个字符串询问其他 questions/parameters,比如项目的长度。
忽略所有似乎与您的问题无关的 csv 文件内容,假设您有一个列表 salary
。您可以使用 collections
中的 Counter
class 来计算唯一列表元素。
因此,关于如何从 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)
。
我目前有一个 Python 字典,其中的键分配给多个值(来自 CSV),格式类似于:
{
'hours': ['4', '2.4', '5.8', '2.4', '7'],
'name': ['Adam', 'Bob', 'Adam', 'John', 'Harry'],
'salary': ['55000', '30000', '55000', '30000', '80000']
}
(实际字典在键和值方面都明显更大。)
我正在寻找每组值的模式*,规定所有值仅出现一次的位置不需要模式。但是,我不确定该怎么做(而且我找不到任何其他与此类似的示例)。我还担心每组值的不同(隐含)数据类型(例如 'hours' 值是浮点数,'name' 值是字符串,'salary' 值是整数),尽管我有包括但尚未使用的基本转换功能。
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' class ,那么如果类型 returns 一个字符串询问其他 questions/parameters,比如项目的长度。
忽略所有似乎与您的问题无关的 csv 文件内容,假设您有一个列表 salary
。您可以使用 collections
中的 Counter
class 来计算唯一列表元素。
因此,关于如何从 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)
。