加入列表和另一个列表?

时间:2017-04-28 12:17:25

标签: python list dictionary

我希望阅读一个列表,其中包含列名称和另一个列表列表,其中包含需要映射到列的数据。列表列表中的每个列表都是一行数据,以后可以推送到数据库中。

我尝试使用以下代码加入这两个列表: get()但我收到了一个错误:

dict(zip( column_names, data))

如何将列表列表和其他列表一起加入dict?

TypeError unhashable type: 'list'

我正在寻求的结果是:

column_names = ['id', 'first_name', 'last_name', 'city', 'dob']

data = [
     ['1', 'Mike', 'Walters', 'New York City', '1998-12-01'],
     ['2', 'Daniel', 'Strange', 'Baltimore', '1992-08-12'],
     ['3', 'Sarah', 'McNeal', 'Miami', '1990-05-05'],
     ['4', 'Steve', 'Breene', 'Philadelphia', '1988-02-06']
]

后来希望用SQLAlchemy将这个dicts的词汇推送到数据库。

7 个答案:

答案 0 :(得分:6)

您可以创建一个键值对列表,如下所示:

result = [dict(zip(column_names, row)) for row in data]

请注意,括号不像您指定的那样卷曲。

答案 1 :(得分:1)

zip在你的情况下不起作用,因为它映射一对一的输入参数。

Zip Documentation

<强>演示:

>>> l1 = ["key01", "key02", "key03"]
>>> l2 = ["value01", "value02", "value03"]
>>> zip(l1, l2)
[('key01', 'value01'), ('key02', 'value02'), ('key03', 'value03')]
>>> dict(zip(l1, l2))
{'key01': 'value01', 'key02': 'value02', 'key03': 'value03'}
>>> 

使用普通iteration and list append方法创建最终输出:

<强>演示:

>>> list_data_items  = []
>>> for item in data:
...    list_data_items.append(dict(zip(column_names, item)))
... 

答案 2 :(得分:1)

上述所有其他答案都运行良好。只是为了完整起见,您还可以使用pandas(如果您的数据来自csv文件,可能会很方便。)

只需使用您的数据创建一个数据框,然后将其转换为dict:

import pandas as pd
df = pd.DataFrame(data, columns=column_names)
df.to_dict(orient='records')

答案 3 :(得分:1)

两个简单的for循环:

column_names = ['id', 'first_name', 'last_name', 'city', 'dob']

data = [
    ['1', 'Mike', 'Walters', 'New York City', '1998-12-01'],
    ['2', 'Daniel', 'Strange', 'Baltimore', '1992-08-12'],
    ['3', 'Sarah', 'McNeal', 'Miami', '1990-05-05'],
    ['4', 'Steve', 'Breene', 'Philadelphia', '1988-02-06']
        ]

db_result = []
for data_row in data:
  new_db_row = {}
  for i, data_value in enumerate(data_row):
    new_db_row[column_names[i]] = data_value
  result.append(new_db_row)
print(result)

First For语句循环遍历所有数据行。 第二个使用枚举来分隔索引(i)和行的data_value。索引用于从list_names列表中提取列名。

我希望这种解释不会让它变得更复杂。 按照打印结果。

[{&#39; id&#39;:&#39; 1&#39;,&#39; first_name&#39;:&#39; Mike&#39;,&#39; last_name&#39;: &#39; Walters&#39; city&#39 ;:&#39;纽约市&#39;&#39; dob&#39;:&#39; 1998-12-01&#39; },{&#39; id&#39;:&#39; 2&#39;,&#39; first_name&#39;:&#39; Daniel&#39;,&#39; last_name&#39;:&# 39;奇怪的&#39;,&#39;城市&#39;:&#39;巴尔的摩&#39;&#39; dob&#39;:&#39; 1992-08-12&#39;},{& #39; id&#39;:&#39; 3&#39;,&#39; first_name&#39;:&#39; Sarah&#39;,&#39; last_name&#39;:&#39; McNeal&# 39;,&#39; city&#39;:&#39; Miami&#39;,&#39; dob&#39;:&#39; 1990-05-05&#39;},{&#39; id& #39;:&#39; 4&#39;,&#39; first_name&#39;:&#39; Steve&#39;,&#39; last_name&#39;:&#39; Breene&#39;,& #39; city&#39;:&#39;费城&#39;,&#39; dob&#39;:&#39; 1988-02-06&#39;}]

答案 4 :(得分:0)

由于您要构建多个词典,因此必须使用zip中的每个列表data列名称,并将结果传递给dict构造函数。您的结果dict_items也需要是一个可以存储不可用类型(如词典)的集合。我们不能使用set(你说你正在寻找),但我们可以使用列表(或元组)。

使用简单的列表理解,为data中的每个子列表构建一个字典。

>>> [dict(zip(column_names, sublist)) for sublist in data]
[{'dob': '1998-12-01', 'city': 'New York City', 'first_name': 'Mike', 'last_name': 'Walters', 'id': '1'}, {'dob': '1992-08-12', 'city': 'Baltimore', 'first_name': 'Daniel', 'last_name': 'Strange', 'id': '2'}, {'dob': '1990-05-05', 'city': 'Miami', 'first_name': 'Sarah', 'last_name': 'McNeal', 'id': '3'}, {'dob': '1988-02-06', 'city': 'Philadelphia', 'first_name': 'Steve', 'last_name': 'Breene', 'id': '4'}]

我还假设您的预期结果中的{'id':'2'}是拼写错误。

答案 5 :(得分:0)

使用Pandas

>>> column_names
['id', 'first_name', 'last_name', 'city', 'dob']
>>> data
[['1', 'Mike', 'Walters', 'New York City', '1998-12-01'], ['2', 'Daniel', 'Strange', 'Baltimore', '1992-08-12'], ['3', 'Sarah', 'McNeal', 'Miami', '1990-05-05'], ['4', 'Steve', 'Breene', 'Philadelphia', '1988-02-06']]
>>> import pandas as pd
>>> pd.DataFrame(data, columns=column_names).T.to_dict().values()
[{'dob': '1998-12-01', 'city': 'New York City', 'first_name': 'Mike', 'last_name': 'Walters', 'id': '1'}, {'dob': '1992-08-12', 'city': 'Baltimore', 'first_name': 'Daniel', 'last_name': 'Strange', 'id': '2'}, {'dob': '1990-05-05', 'city': 'Miami', 'first_name': 'Sarah', 'last_name': 'McNeal', 'id': '3'}, {'dob': '1988-02-06', 'city': 'Philadelphia', 'first_name': 'Steve', 'last_name': 'Breene', 'id': '4'}]

答案 6 :(得分:0)

column_names = ['id', 'first_name', 'last_name', 'city', 'dob']

data = [
     ['1', 'Mike', 'Walters', 'New York City', '1998-12-01'],
     ['2', 'Daniel', 'Strange', 'Baltimore', '1992-08-12'],
     ['3', 'Sarah', 'McNeal', 'Miami', '1990-05-05'],
     ['4', 'Steve', 'Breene', 'Philadelphia', '1988-02-06']
]

destinationList = []

for value in data: 
  destinationList.append(dict(zip(column_names,value)))
print(destinationList)
  #
# zip(column_names,value)
# [('id', '1'), ('first_name', 'Mike') , ('last_name', 'Walters'), ('city', 'New York City'),('dob', '1998-12-01')]]
# dict(zip(column_names,value))
# {'last_name': 'Walters', 'dob': '1998-12-01','id': '1','first_name': 'Mike','city': 'New York City'}