【问题标题】:How to assign a dictionary to each of another dictionary's values in Python?如何在 Python 中将字典分配给另一个字典的每个值?
【发布时间】:2020-12-07 20:21:10
【问题描述】:

我有两本内容相关的字典。一个是由以 'shopid' 作为 key 并以 'userid' 的数据集形成的> 作为 。另一个字典由相同的数据集组成,但将 'userid' 作为 key'datetime ' 此用户购买的商品的价值

我希望能够做的是创建一个 for 循环(或类似的循环),对于每个“shopid”键,都获取“userid”值并将这些“userid”值转换为包含“第二个字典中的日期时间值。这是针对大型数据集的。

我了解字典对您可以对它们执行的操作有一些限制,因此很高兴知道这是否可行,或者是否有更好的方法来获得类似的结果?

作为输入/输出理想的例子:

dict1 = {'shopid1':['userid1','userid2','userid3']}
dict2 = {
    'userid1':['2020-08-17 09:00','2020-08-18 08:30'], 
    'userid2':['2020-08-16 11:00','2020-08-15 13:30'], 
    'userid3':['2020-08-18 09:30','2020-08-18 10:00','2020-08-18 11:30']
    }
    
combined_dict = {
    'shopid1':{
        'userid1':['2020-08-17 09:00','2020-08-18 08:30'],
        'userid2':['2020-08-16 11:00','2020-08-15 13:30'],
        'userid3':['2020-08-18 09:30','2020-08-18 10:00','2020-08-18 11:30']
        }
    }  

编辑:

我要合并的实际字典如下所示:

shopid = {10159: [[[62775725, 214988798, 214988798, 214988798, 62775725, 
    62775725]]]
userid = {166840413: [[datetime.datetime(2019, 12, 29, 15, 48), 
    datetime.datetime(2019, 12, 29, 15, 48), datetime.datetime(2019, 12, 29, 
    15, 48)]]

我相信多余的方括号是使用默认字典几次创建新的缩短字典的产物,这些字典删除了不符合问题要求的值。

【问题讨论】:

  • 这个练习的高层次目标是什么?大局是什么?你用过pandas.DataFrame吗?您可能会发现它很有用。
  • 字典的限制是它们的键必须是不可变的/可散列的。所以作为字符串、数字、字符串元组等的键是可以的。不允许将列表、迭代器或其他字典作为键。所以在这种情况下,所有的键都是字符串!一切顺利,只需遍历这两个字典即可构建您想要的字典。
  • @Robert 总体目标是找出哪些用户在一小时内在一家商店进行了超过 3 次购买(取自 Kaggle 的刷单问题)。我最初使用数据框来访问 csv 中的数据,但在剔除不符合要求的商店或用户时,我认为制作字典是一个不错的选择 - 可能我错了!
  • @bbbbbb 对,这是有道理的。我刚刚编辑了我的问题以添加我的两个字典的实际外观 - 多个方括号会是我的问题的原因吗?我在下面使用了 Colin 的答案,它为每个 shopid 返回了一个空字典。

标签: python pandas list dictionary append


【解决方案1】:

你可以用字典理解来做到这一点:

combined_dict = {i: {j: dict2[j] for j in dict1[i]} for i in dict1}

输出:

>>> from pprint import pprint as pp
>>> pp(combined_dict)
{'shopid1': {'userid1': ['2020-08-17 09:00', '2020-08-18 08:30'],
             'userid2': ['2020-08-16 11:00', '2020-08-15 13:30'],
             'userid3': ['2020-08-18 09:30',
                         '2020-08-18 10:00',
                         '2020-08-18 11:30']}}

【讨论】:

  • 如果您正在处理大型数据集,那么您应该考虑@Robert 的评论并使用更适合大型数据集的工具。
【解决方案2】:
dict1 = {'shopid1':['userid1','userid2','userid3']}
dict2 = {'userid1':['2020-08-17 09:00','2020-08-18 08:30'], 
'userid2':['2020-08-16 11:00','2020-08-15 13:30'], 
'userid3':['2020-08-18 09:30','2020-08-18 10:00','2020-08-18 11:30']}
combined_dict ={'shopid1':{'userid1':['2020-08-17 09:00','2020-08-18 08:30'],
'userid2':['2020-08-16 11:00','2020-08-15 13:30'],
'userid3':['2020-08-18 09:30','2020-08-18 10:00','2020-08-18 11:30']}}
for i in combined_dict:
    print(i)
    a=combined_dict[i]
    for j in a:
        b=a[j]
        print(j)
        for k in b:
            print(k)

【讨论】:

    【解决方案3】:

    这是一个很好的“理解”案例,它被优化为比循环快得多:

    combined_dict = { k:
                {u:t for (u,t) in dict2.items() if u in v}  
                for (k,v) in dict1.items()
                }
    

    详情请看这里:https://www.python.org/dev/peps/pep-0274/

    【讨论】:

    • 谢谢你,我相信这就是我要找的。不幸的是,由于我在之前的代码中组织数据的方式,我最终在字典键中得到了列表。例如 dict1.items() 返回:dict_items([(10159, [[[62775725, 214988798, 214988798, 214988798, 62775725, 62775725]]]). dict2 也是如此,尽管它只有两组方括号它的值。我认为这意味着我需要重写我以前的代码!现在打印 combine_dict 只是返回带有空 {} 作为值的 shopid 键值。
    • 我发现这是因为使用 defaultdict(list) 来创建我的字典。例如shop_dict = defaultdict(list) 商店中的商店:shops_dict[shop].append(sData[shop]) shops_dict = dict(shops_dict)。不确定如何解决这个问题,我在整个代码中使用了类似的 for 循环来减少我的数据 - 欢迎任何想法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多