【问题标题】:how to convert from list of lists to a dictionary如何从列表列表转换为字典
【发布时间】:2022-01-14 15:01:43
【问题描述】:

嗨 :) 我有这个表,我需要将它转换成字典,其中第一行是键,然后其余表中的每个值都是值,但每次都遍历它们。我有这张桌子:

my_table = [["Account Manager", "Name", "BP", "Contact", "Quote Name", "Type", "Status", "Total"],
            ["bubble", "kwlak", "5677", "conn", "987", "butter", "fish", "fill", "stat", "total"],
            ["rose", "kwlak", "5677", "conn", "987", "butter", "fish", "fill", "stat", "total"],
            ["purple", "kwlak", "5677", "conn", "987", "butter", "fish", "fill", "stat", "total"],
            ["dark", "kwlak", "5677", "conn", "987", "butter", "fish", "fill", "stat", "total"],
            ["star", "kwlak", "5677", "conn", "987", "butter", "fish", "fill", "stat", "total"],
            ["asmr", "kwlak", "5677", "conn", "987", "butter", "fish", "fill", "stat", "total"],]

这是用于迭代它的代码:

dict_from_table = {}
for position, key in enumerate(my_table[0]):
  dict_from_table[key] = []
  for value_row in my_table[1:2]:
    dict_from_table[key].append(value_row[position])

print(dict_from_table)

这是它的输出:

{'Account Manager': ['bubble'], 'Name': ['kwlak'], 'BP': ['5677'], 'Contact': ['conn'], 'Quote Name': ['987'], 'Type': ['butter'], 'Status': ['fish'], 'Total': ['fill']}

我需要它遍历所有列表并为键(帐户管理器、名称等)返回每个值一次,但我也不希望它以列表形式返回值,我希望它在与键相同的字典。我需要另一个 for 循环吗?

【问题讨论】:

  • 您需要将其作为列表返回,因为每个键都必须是唯一的
  • my_table 中的第一个列表有 8 个元素,但其他列表有 10 个元素。所以你不能使用第一个列表作为其他列表元素的键。
  • 按照 Mohammed Khoshbin 的建议,您将遇到 IndexError

标签: python list loops dictionary key-value


【解决方案1】:

你的嵌套循环是倒置的。由于您的键是固定的,因此从这些键构建一个空字典,并将空列表作为值:

In [7]: my_table = [["Account Manager", "Name", "BP", "Contact", "Quote Name", "Type", "Status", "Total"],
   ...:             ["bubble", "kwlak", "5677", "conn", "987", "butter", "fish", "fill", "stat", "total"],
   ...:             ["rose", "kwlak", "5677", "conn", "987", "butter", "fish", "fill", "stat", "total"],
   ...:             ["purple", "kwlak", "5677", "conn", "987", "butter", "fish", "fill", "stat", "total"],
   ...:             ["dark", "kwlak", "5677", "conn", "987", "butter", "fish", "fill", "stat", "total"],
   ...:             ["star", "kwlak", "5677", "conn", "987", "butter", "fish", "fill", "stat", "total"],
   ...:             ["asmr", "kwlak", "5677", "conn", "987", "butter", "fish", "fill", "stat", "total"],]
   ...:

In [8]: keys = my_table[0]

In [9]: result = {k:[] for k in keys}

然后遍历表格的其余部分:

In [10]: for row in my_table[1:]:
    ...:     for k,v in zip(keys, row):
    ...:         result[k].append(v)
    ...:

In [11]: result
Out[11]:
{'Account Manager': ['bubble', 'rose', 'purple', 'dark', 'star', 'asmr'],
 'Name': ['kwlak', 'kwlak', 'kwlak', 'kwlak', 'kwlak', 'kwlak'],
 'BP': ['5677', '5677', '5677', '5677', '5677', '5677'],
 'Contact': ['conn', 'conn', 'conn', 'conn', 'conn', 'conn'],
 'Quote Name': ['987', '987', '987', '987', '987', '987'],
 'Type': ['butter', 'butter', 'butter', 'butter', 'butter', 'butter'],
 'Status': ['fish', 'fish', 'fish', 'fish', 'fish', 'fish'],
 'Total': ['fill', 'fill', 'fill', 'fill', 'fill', 'fill']}

虽然请注意,这假设您在第一行中的键与其余键对齐...示例数据没有,但我认为这只是一个转录错误。

【讨论】:

  • 好的理解,但我可以让每个键在一次迭代中具有一次值,如下所示:{'Account Manager': 'bubble', 'Name': 'kwlak', 'BP': ' 5677','联系人':'conn','报价名称':'987','类型':'butter','状态':'fish','总计':'fill','客户经理':'玫瑰','名称':'kwlak','BP':'5677','联系人':'conn','报价名称':'987','类型':'黄油','状态':'鱼', 'Total': 'fill', } 等每个值
  • @Andy 不,字典键必须是唯一的
  • 哦,对了,我一直忽略...
  • 变得更容易了吗?我会觉得这些很容易吗?
  • @Andy 练习,当然。一旦你多次看到相同类型的问题,你就会知道下次看到它时如何处理它。
【解决方案2】:

您可以使用zip 来“转置”表格(切换行和列):

output = {column[0]: column[1:] for column in zip(*my_table)}

(如果您需要列表而不是元组,请使用list(column[1:])。)

但是,如果您对表数据进行大量操作,请考虑使用pandas。您可以像这样创建一个数据框:

import pandas as pd
df = pd.DataFrame(my_table[1:], columns=my_table[0])

然后将其导出回这样的列表字典:

output = df.to_dict("list")

(您需要首先确保每行中的列标题与单元格的数量相同。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2021-10-13
    • 1970-01-01
    • 2011-07-11
    • 2015-07-23
    相关资源
    最近更新 更多