【问题标题】:Create a dictionary with specific pairs from other dictionaries使用来自其他字典的特定对创建字典
【发布时间】:2020-09-23 19:05:05
【问题描述】:

此列表:

data=[[{'t1':'text1.txt','date1':'class1'}],[{'t2':'text2.txt','date2':'class2'}]]
data

给予

[[{'t1': 'text1.txt', 'date1': 'class1'}],
 [{'t2': 'text2.txt', 'date2': 'class2'}]]

我想把它变成这样: 编辑括号添加

[[{'text1.txt': 'class1'}], [{'text2.txt': 'class2'}]]

意思是:

要创建一个列表,其中每个子列表将由一个字典组成,其中 key 将是第一个子列表中第一个字典的 value 和 value 将是第一个子列表的第二个字典的 value,对于以下子列表,依此类推。

我的尝试是这样的:

se=[]
for i in data:
    for j in i:
        jk=j.values()
        se.append(jk)
se

【问题讨论】:

  • 为了澄清,您想创建一个字典,其中每个输入字典包含一个 key:value 对?每个输入字典都有两个键:值对?
  • 是的,如示例所示。

标签: python list dictionary for-loop


【解决方案1】:

遍历嵌套列表中的每个字典,并从values() 方法为每个字典创建一个元组,例如tuple(dict.values())。转换为元组后,您可以使用dict() 从元组创建字典,如下所示dict([tuple(dict.values())])

注意:如果您的字典正好有两个键,那么只有它会起作用。

res = [[dict([tuple(d.values())]) for d in lst]for lst in data]
print(res)

输出:

[[{'text1.txt': 'class1'}], [{'text2.txt': 'class2'}]]

【讨论】:

  • 抱歉这个错误。我忘了括号。这是需要的结果:[[{'text1.txt': 'class1'}], [{'text2.txt': 'class2'}]]
  • 您可以修改您的答案以给出上述结果吗?谢谢
【解决方案2】:

您的代码完成了大部分工作。您可以添加另一行以获得所需的结果:

In [108]: se
Out[108]: [dict_values(['text1.txt', 'class1']), dict_values(['text2.txt', 'class2'])]

In [109]: [[{list(x)[0]:list(x)[1]} for x in se]]
Out[109]: [[{'text1.txt': 'class1'}, {'text2.txt': 'class2'}]]

【讨论】:

  • 抱歉这个错误。我忘了括号。这是需要的结果: [[{'text1.txt': 'class1'}], [{'text2.txt': 'class2'}]]
  • 这应该可以完成工作:In [128]: [[{list(x)[0]:list(x)[1]}] for x in se] Out[128]: [[{'text1.txt': 'class1'}], [{'text2.txt': 'class2'}]]
【解决方案3】:

试试这个:

data=[[{'t1':'text1.txt','date1':'class1'}],[{'t2':'text2.txt','date2':'class2'}]]

all_vals = [];

for i in data:
    for j in i:
        for key in j:
            all_vals.append(j[key])

new_list = [];            
for i in range(0,len(all_vals)-1):
    if (i % 2) == 0:
        new_dict = {};
        new_dict = {all_vals[i]:all_vals[i+1]}
        new_list.append(new_dict)
    else:
        continue
        
print(new_list)

输出:

[{'text1.txt': 'class1'}, {'text2.txt': 'class2'}]

无论您的列表长度如何,此代码都有效。

【讨论】:

    【解决方案4】:

    以下函数应将输入转换为您请求的输出。

    def convert_to_list_of_list_of_dictionaries(input_dictionaries):
      ret_dictionaries = []
      for inp in input_dictionaries:
        k, v = inp[0].values()
        ret_dictionaries.append({k, v})
      return ret_dictionaries
    

    但是,输入/输出发生的一些事情很少引起关注,并且使数据更难处理。 在输入端,数据被包装在一个额外的列表中,在这种情况下,它不提供任何功能,并强制您索引内部列表的第一个元素以访问字典k, v = inp[0].values()。在输出端,我们正在做同样的事情,这使得迭代输出变得更加困难。它看起来像:

    # psuedocode
    for kv in reformatted_outputs:
        unwrapped_dict = kv[0]
        key, value = next(iter(unwrapped_dict.items()))
        # process key and value
    
    

    相反,如果您的输出格式类似于 ``{'text1.txt': 'class1', 'text2.txt': 'class2'}`,则可以处理如下数据:

    key, value in reformatted_outputs.items():
        # process key and value
    

    如果您能够修改您正在处理的工作的输入和输出,这可以为您节省一些麻烦,并且您正在处理的任何人都会遇到一些头疼的问题。

    如果您想修改输出格式,您的函数可能类似于:

    def convert_to_single_dictionary(input_dictionaries):
      ret = {}
      for inp in input_dictionaries:
        print(inp)
        # it looks like the input data is being wrapped in an extra list
        k, v = inp[0].values()
        ret[k] = v
      return ret
    

    希望这对您有所帮助,并感谢您提出问题!

    【讨论】:

    • 抱歉这个错误。我忘了括号。这是需要的结果: [[{'text1.txt': 'class1'}], [{'text2.txt': 'class2'}]]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2022-07-23
    • 2018-01-19
    • 2019-02-23
    • 2018-04-30
    • 2016-08-15
    • 1970-01-01
    相关资源
    最近更新 更多