Python 计算字典中项目的频率

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

我有一个名为purchases的字典,它以付款方式为键,还有一个包含付款类型及其频率作为值的字典。格式示例如下所示:

{'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作为期望的输出,但是你同样可以编辑问题的文本
需要列表作为输出。这是最短且唯一的矢量化解决方案,这应该是可接受的答案:这是最短且唯一的矢量化解决方案,这应该是可接受的答案: