Python 计算字典中项目的频率
我有一个名为purchases的字典,它以付款方式为键,还有一个包含付款类型及其频率作为值的字典。格式示例如下所示:Python 计算字典中项目的频率,python,dictionary,python-3.6,Python,Dictionary,Python 3.6,我有一个名为purchases的字典,它以付款方式为键,还有一个包含付款类型及其频率作为值的字典。格式示例如下所示: {'Credit card': {'Grocery': 3, 'Gas': 1, 'Store': 2}, 'Debit card': {'Food': 2}, 'Check': {'Rent': 1, 'Utilities': 1}, … } 我想创建一个新的字典,以支付方式的频率为键,以支付方式为值。期望输出: [{6: ['Credit card']}, {2: ['De
{'Credit card': {'Grocery': 3, 'Gas': 1, 'Store': 2},
'Debit card': {'Food': 2},
'Check': {'Rent': 1, 'Utilities': 1}, … }
我想创建一个新的字典,以支付方式的频率为键,以支付方式为值。期望输出:
[{6: ['Credit card']}, {2: ['Debit card', 'Check']}]
以下是我目前的代码:
artist_count = {}
for artist in artist_songs.keys():
if artist in artist_count:
artist_count[artist] += 1
else:
artist_count[artist] = 1
print(artist_count)
目前,这将输出一个字典,其中每个唯一的支付方法作为键,1作为其值。我很难计算每一个的频率,以及切换键和值。我相信我可以为前者使用len函数,但我还没有运气
如何创建一个以付款方式频率为键、以付款方式为值的新词典?让我们分两步完成: 我们首先制作一个字典,其中键是付款类型,值是频率。 然后,我们反转此词典以获得您想要的词典。 第一部分,
freq_dict = {}
for key in given_dict:
freq_dict[key] = 0
for item in given_dict[key]:
freq_dict[key]+=given_dict[key][item]
第二部分:
result_dict = {}
for key in freq_dict:
value = freq_dict[key]
if value not in result_dict:
result_dict[value] = []
result_dict[value].append(key)
这是我们开始使用的字典
如果有不清楚的地方,请告诉我:让我们分两步进行: 我们首先制作一个字典,其中键是付款类型,值是频率。 然后,我们反转此词典以获得您想要的词典。 第一部分,
freq_dict = {}
for key in given_dict:
freq_dict[key] = 0
for item in given_dict[key]:
freq_dict[key]+=given_dict[key][item]
第二部分:
result_dict = {}
for key in freq_dict:
value = freq_dict[key]
if value not in result_dict:
result_dict[value] = []
result_dict[value].append(key)
这是我们开始使用的字典
如果有不清楚的地方,请告诉我:我的解决方案遵循与@Shagun Sodhani相同的逻辑,但使用一个循环而不是两个循环
payments = {'Credit card': {'Grocery': 3, 'Gas': 1, 'Store': 2},
'Debit card': {'Food': 2},
'Check': {'Rent': 1, 'Utilities': 1}}
sums = {}
for payment_type, payment_entries in payments.items():
# calculate the number of times that a payment was used
payment_type_frequency = sum(payment_entries.values())
# check if the frequencu is already in the result array
if payment_type_frequency in sums.keys():
# if yes, append
sums[payment_type_frequency].append(payment_type)
else:
# else add a new key and assign a one element list to it
sums[payment_type_frequency] = [payment_type]
print(sums)
我们还可以使用defaultdict简化此代码:
import collections
payments = {'Credit card': {'Grocery': 3, 'Gas': 1, 'Store': 2},
'Debit card': {'Food': 2},
'Check': {'Rent': 1, 'Utilities': 1}}
sums = collections.defaultdict(list)
for payment_type, payment_entries in payments.items():
# calculate the number of times that a payment was used
payment_type_frequency = sum(payment_entries.values())
# check if the frequency is already in the result array
sums[payment_type_frequency].append(payment_type)
print(sums)
或者,我们也可以使用列表理解来创建一个外观更智能、但在任何生产代码中都不建议使用的不可读代码:
import collections
payments = {'Credit card': {'Grocery': 3, 'Gas': 1, 'Store': 2},
'Debit card': {'Food': 2},
'Check': {'Rent': 1, 'Utilities': 1}}
sums = collections.defaultdict(list)
[sums[sum(payment_entries.values())].append(payment_type) for payment_type, payment_entries in payments.items()]
print(sums)
我的解决方案遵循与@Shagun Sodhani相同的逻辑,但使用一个循环而不是两个循环
payments = {'Credit card': {'Grocery': 3, 'Gas': 1, 'Store': 2},
'Debit card': {'Food': 2},
'Check': {'Rent': 1, 'Utilities': 1}}
sums = {}
for payment_type, payment_entries in payments.items():
# calculate the number of times that a payment was used
payment_type_frequency = sum(payment_entries.values())
# check if the frequencu is already in the result array
if payment_type_frequency in sums.keys():
# if yes, append
sums[payment_type_frequency].append(payment_type)
else:
# else add a new key and assign a one element list to it
sums[payment_type_frequency] = [payment_type]
print(sums)
我们还可以使用defaultdict简化此代码:
import collections
payments = {'Credit card': {'Grocery': 3, 'Gas': 1, 'Store': 2},
'Debit card': {'Food': 2},
'Check': {'Rent': 1, 'Utilities': 1}}
sums = collections.defaultdict(list)
for payment_type, payment_entries in payments.items():
# calculate the number of times that a payment was used
payment_type_frequency = sum(payment_entries.values())
# check if the frequency is already in the result array
sums[payment_type_frequency].append(payment_type)
print(sums)
或者,我们也可以使用列表理解来创建一个外观更智能、但在任何生产代码中都不建议使用的不可读代码:
import collections
payments = {'Credit card': {'Grocery': 3, 'Gas': 1, 'Store': 2},
'Debit card': {'Food': 2},
'Check': {'Rent': 1, 'Utilities': 1}}
sums = collections.defaultdict(list)
[sums[sum(payment_entries.values())].append(payment_type) for payment_type, payment_entries in payments.items()]
print(sums)
如果熊猫是一个选项,请尝试以下操作:
import pandas as pd
import collections
mycounter=[]
dff = {'Credit card': {'Grocery': 3, 'Gas': 1, 'Store': 2},'Debit card': {'Food': 2},'Check': {'Rent': 1, 'Utilities': 1}}
newdf2 = pd.read_json(json.dumps(dff))
for i,j in newdf2.iteritems():
mycounter.append({ newdf2[i].sum().astype(int) :[i]})
res = {}
for d in mycounter:
for k, v in d.items():
res.setdefault(k, []).extend(v)
res
#[{6: ['Credit card']}, {2: ['Debit card', 'Check']}]
如果熊猫是一个选项,请尝试以下操作:
import pandas as pd
import collections
mycounter=[]
dff = {'Credit card': {'Grocery': 3, 'Gas': 1, 'Store': 2},'Debit card': {'Food': 2},'Check': {'Rent': 1, 'Utilities': 1}}
newdf2 = pd.read_json(json.dumps(dff))
for i,j in newdf2.iteritems():
mycounter.append({ newdf2[i].sum().astype(int) :[i]})
res = {}
for d in mycounter:
for k, v in d.items():
res.setdefault(k, []).extend(v)
res
#[{6: ['Credit card']}, {2: ['Debit card', 'Check']}]
也可以这样做:
df = pd.DataFrame({'vals':[*in_dict.values()],'vars':[*in_dict.keys()]})
df['vals'] = df['vals'].apply(lambda x: sum(x.values())) #because nested dict
out_dict = df.groupby('vals')['vars'].agg(list).to_dict()
输出:
{2: ['Debit card', 'Check'], 6: ['Credit card']}
也可以这样做:
df = pd.DataFrame({'vals':[*in_dict.values()],'vars':[*in_dict.keys()]})
df['vals'] = df['vals'].apply(lambda x: sum(x.values())) #because nested dict
out_dict = df.groupby('vals')['vars'].agg(list).to_dict()
输出:
{2: ['Debit card', 'Check'], 6: ['Credit card']}
一种简单的方法是使用此处的列表按金额分组并附加付款方式:
from collections import defaultdict
data = {
"Credit card": {"Grocery": 3, "Gas": 1, "Store": 2},
"Debit card": {"Food": 2},
"Check": {"Rent": 1, "Utilities": 1},
}
payment_map = defaultdict(list)
for method, payments in data.items():
total = sum(payments.values())
payment_map[total].append(method)
print([{k: v} for k, v in payment_map.items()])
# [{6: ['Credit card']}, {2: ['Debit card', 'Check']}]
在这里使用defaultdict的好处是,当添加新密钥时,它会自动为您创建列表。您不必自己动手,这也会导致代码更干净
如果您更喜欢非库解决方案,您可以在此处使用:
payment_map = {}
for method, payments in data.items():
total = sum(payments.values())
payment_map.setdefault(total, []).append(method)
注意:对于有关defaultdict如何工作的更多信息,这是一个很好的问题 一个简单的方法是使用此处的列表按金额分组并附加付款方式:
from collections import defaultdict
data = {
"Credit card": {"Grocery": 3, "Gas": 1, "Store": 2},
"Debit card": {"Food": 2},
"Check": {"Rent": 1, "Utilities": 1},
}
payment_map = defaultdict(list)
for method, payments in data.items():
total = sum(payments.values())
payment_map[total].append(method)
print([{k: v} for k, v in payment_map.items()])
# [{6: ['Credit card']}, {2: ['Debit card', 'Check']}]
在这里使用defaultdict的好处是,当添加新密钥时,它会自动为您创建列表。您不必自己动手,这也会导致代码更干净
如果您更喜欢非库解决方案,您可以在此处使用:
payment_map = {}
for method, payments in data.items():
total = sum(payments.values())
payment_map.setdefault(total, []).append(method)
注意:对于有关defaultdict如何工作的更多信息,这是一个很好的问题 请提出一个真正的问题。提前谢谢。@PeterMortensen刚刚编辑了它。您必须首先计算付款方式的频率。一旦有了这些值,您就可以循环使用这些值并填充一个新字典,如果存在频率,您可以将付款添加到其列表中,否则,您可以使用新频率向dict添加一个新项目,并使用单个付款方法向列表添加一个新项目。希望这有帮助。你真的想把付款方式的频率作为关键吗?我没有看到一个好的用例。您是否希望将付款方式保留为键,但有一个键=付款方式,值=频率的新dict?您是否希望列表或dict作为所需的输出?你写了dict,但你的例子是一个列表。我编辑了你的问题,假设它是一个dict作为所需的输出,但是你同样可以编辑问题的文本,要求一个列表作为输出。请提出一个真正的问题。提前谢谢。@PeterMortensen刚刚编辑了它。您必须首先计算付款方式的频率。一旦有了这些值,您就可以循环使用这些值并填充一个新字典,如果存在频率,您可以将付款添加到其列表中,否则,您可以使用新频率向dict添加一个新项目,并使用单个付款方法向列表添加一个新项目。希望这有帮助。你真的想把付款方式的频率作为关键吗?我没有看到一个好的用例。您是否希望将付款方式保留为键,但有一个键=付款方式,值=频率的新dict?您是否希望列表或dict作为所需的输出?你写了dict,但你的例子是一个列表。我编辑了你的问题,假设它是一个dict作为期望的输出,但是你同样可以编辑问题的文本
需要列表作为输出。这是最短且唯一的矢量化解决方案,这应该是可接受的答案:这是最短且唯一的矢量化解决方案,这应该是可接受的答案: