从包含列表的列表中对python进行口述
我创建了一个包含列表的列表从包含列表的列表中对python进行口述,python,list,dictionary,Python,List,Dictionary,我创建了一个包含列表的列表 [['2020/10/07', 'AA123', '19.24', '22.00'], ['2020/11/17', 'BBB123', '23.59', '00.00'], ['2020/14/67', 'AAA123', '08.00', '16.00']] 问题1:但是我不确定如何把这个列表变成字典。我试过好几次了,但都不管用。我希望每个列表中的第二个值(索引1)是字典的键,其余的是值 问题2:如果每个列表中的第二个元素存在于多个列表中,我希望它们位于同一
[['2020/10/07', 'AA123', '19.24', '22.00'],
['2020/11/17', 'BBB123', '23.59', '00.00'],
['2020/14/67', 'AAA123', '08.00', '16.00']]
问题1:但是我不确定如何把这个列表变成字典。我试过好几次了,但都不管用。我希望每个列表中的第二个值(索引1)是字典的键,其余的是值
问题2:如果每个列表中的第二个元素存在于多个列表中,我希望它们位于同一个键下。尝试以下操作:
my_dict={}
对于VAL中的子列表:
val_key=子_列表[1]
如果val_在my_dict中输入:
my_dict[val_key]。扩展([sub_list[0]]]+sub_list[2:])
其他:
my_dict[val_key]=[sub_list[0]]+sub_list[2:]
sub_list[1]
),我们将使用它为词典编制索引[1]
值扩展存储在该列表中的值(例如['a','b','c']
变为['a','b','c','d','e']
)[1]
值创建一个新键您可以首先使用列表理解从第一个列表中提取键和值:
keys = [row[1] for row in l]
values = [[row[0], row[2],row[3]] for row in l]
然后使用相同的技巧创建词汇:
{k:v for k,v in zip(keys,values)}
(使用zip
函数可以同时迭代2个列表键和值)
对于问题2:不幸的是,您不能在一个字典中多次使用同一个键,您可能必须使用len(keys)==len(set(keys))
来测试您的键列表是否有重复项(set
函数从列表中提取所有唯一值)
我们可以这样做:
from collections import defaultdict, namedtuple
Data = namedtuple('Data', ('date', 'val1', 'val2'))
res = defaultdict(list)
for date, key, val1, val2 in raw:
data = Data(date, val1, val2)
res[key].append(data)
res = dict(res) # Strip defaultdict behavior
然后我们可以看到
import pprint
pprint.pprint(res)
为我们提供了与所需结果相似的结果:
{'AAA123': [Data(date='2020/10/07', val1='19.24', val2='22.00'),
Data(date='2020/14/67', val1='08.00', val2='16.00')],
'BBB123': [Data(date='2020/11/17', val1='23.59', val2='00.00')]}
“我希望每个列表(索引1)中的第二个值是字典的键,其余的值是值。”您可以编写代码,获取其中一个列表并生成相应的键吗?您是否可以编写代码以获取这些列表之一并生成适当的值?你能写一些代码来获取键和值并生成一个dict吗?你试着写什么代码?你用它的时候发生了什么?如果每个列表中的第二个元素存在于多个列表中,我希望它们位于同一个键下。“它们”是什么?你能举一个输入数据的例子,其中包含这些匹配的数据,并准确地说明结果dict应该是什么吗?
import pprint
pprint.pprint(res)
{'AAA123': [Data(date='2020/10/07', val1='19.24', val2='22.00'),
Data(date='2020/14/67', val1='08.00', val2='16.00')],
'BBB123': [Data(date='2020/11/17', val1='23.59', val2='00.00')]}