【问题标题】:Duplicate the dictionary for each in key value list为键值列表中的每个复制字典
【发布时间】:2016-03-16 15:13:18
【问题描述】:

我有一个 Python 字典,如下所示:

dicts = [{'uid':'12345', 'markets':'['UK', 'US']'},
         {'uid':'55644', 'markets':'['IN', 'SG', 'IE']'}]

我真正需要的是为 'markets' 列表中的每个项目制作的任何字典的副本,以及 dicts 列表中的每个字典。应该是这样的:

dicts = [{'uid':'12345', 'markets':'['UK']'},
         {'uid':'12345', 'markets':'['US']'},
         {'uid':'55644', 'markets':'['IN']'},
         {'uid':'55644', 'markets':'['IE']'},
         {'uid':'55644', 'markets':'['SG']'}]

谁能帮我理解 Python 中解决这个问题的最佳方法?

【问题讨论】:

  • 是列表拼写错误之前的引号,'['UK', 'US']' 不应该是 ['UK', 'US']

标签: python list loops dictionary


【解决方案1】:

以下代码将创建一个字典列表:

dicts = [{'uid':'12345', 'markets':['UK', 'US']},
         {'uid':'55644', 'markets':['IN', 'SG', 'IE']}]

def flatten(lists):
    res = []
    for d in lists:
        for market in d['markets']:
            res.append({'uid': d['uid'], 'markets': [market]})

    return res

print flatten(dicts)

# [{'markets': ['UK'], 'uid': '12345'}, {'markets': ['US'], 'uid': '12345'},
#  {'markets': ['IN'], 'uid': '55644'}, {'markets': ['SG'], 'uid': '55644'},   
#  {'markets': ['IE'], 'uid': '55644'}]

代码将遍历原始列表中的字典。对于每个字典,代码将遍历市场,并且对于每个市场,它将向结果列表添加一个新字典。除了print 之外,该代码将同时在 Python 2 和 Python 3 上运行。

【讨论】:

  • 谢谢!如果有 15 个以上的键,那么编写附加行的最佳方法是什么?如果只有“市场”字段发生变化,将它们写出来仍然是最好的方法吗?
  • 您可以在内部循环中复制当前字典,将market分配给copy['markets']并附加复制结果列表。
【解决方案2】:

你可以(python 3)试试:

dicts = [{'uid':'12345', 'markets':['UK', 'US']},
         {'uid':'55644', 'markets':['IN', 'SG', 'IE']}]


def _split_dict(dict_):
    for country in dict_["markets"]:
        yield {'markets': [country], 'uid': dict_['uid']}


def split_dicts(dicts):
    for dict_ in dicts:
        yield from _split_dict(dict_)


print(list(split_dicts(dicts)))
# [{'uid': '12345', 'markets': ['UK']}, {'uid': '12345', 'markets': ['US']}, {'uid': '55644', 'markets': ['IN']}, {'uid': '55644', 'markets': ['SG']}, {'uid': '55644', 'markets': ['IE']}]

【讨论】:

    猜你喜欢
    • 2016-01-07
    • 2021-12-17
    • 2014-05-21
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    相关资源
    最近更新 更多