And*_*rew 3 python dictionary list
所以我有一个键列表:
keys = ['id','name', 'date', 'size', 'actions']
Run Code Online (Sandbox Code Playgroud)
我还有一个vales列表列表:
values=
[
['1','John','23-04-2015','0','action1'],
['2','Jane','23-04-2015','1','action2']
]
Run Code Online (Sandbox Code Playgroud)
如何使用与值匹配的键构建字典?
输出应该是:
{
'id':['1','2'],
'name':['John','Jane'],
'date':['23-04-2015','23-04-2015'],
'size':['0','1'],
'actions':['action1','action2']
}
Run Code Online (Sandbox Code Playgroud)
编辑:我试图使用zip()和dict(),但这只有在值列表有1个列表时才有效,即 values = [['1','John','23-04-2015','0','action1']]
for list in values:
dic = dict(zip(keys,list))
Run Code Online (Sandbox Code Playgroud)
我还想过用键来初始化一个dic,然后自己建立一个值列表,但我觉得必须有一个更简单的方法来做.
dic = dict.fromkeys(keys)
for list in values:
ids = list[0]
names = list[1]
dates = list[2]
sizes = list[3]
actions = list[4]
Run Code Online (Sandbox Code Playgroud)
然后最后
dic['id'] = ids
dic['name'] = names
dic['date'] = dates
dic['size'] = sizes
dic['action'] = actions
Run Code Online (Sandbox Code Playgroud)
这看起来真的很傻,我想知道更好的做法是什么.
>>> keys = ['id','name', 'date', 'size', 'actions']
>>> values = [['1','John','23-04-2015','0','action1'], ['2','Jane','23-04-2015','1','action2']]
>>> c = {x:list(y) for x,y in zip(keys, zip(*values))}
>>> c
{'id': ['1', '2'], 'size': ['0', '1'], 'actions': ['action1', 'action2'], 'date': ['23-04-2015', '23-04-2015'], 'name': ['John', 'Jane']}
>>> print(*(': '.join([item, ', '.join(c.get(item))]) for item in sorted(c, key=lambda x: keys.index(x))), sep='\n')
id: 1, 2
name: John, Jane
date: 23-04-2015, 23-04-2015
size: 0, 1
actions: action1, action2
Run Code Online (Sandbox Code Playgroud)
这使用了几个工具:
c是用字典理解创建的.理解是表达像字典或列表这样的可迭代的不同方式.而不是初始化一个空的迭代,然后使用循环向其添加元素,理解将这些语法结构移动.
result = [2*num for num in range(10) if num%2]
Run Code Online (Sandbox Code Playgroud)
相当于
result = []
for num in range(10):
if num%2: # shorthand for "if num%2 results in non-zero", or "if num is not divisible by 2"
result.append(2*num)
Run Code Online (Sandbox Code Playgroud)
我们得到了[2, 6, 10, 14, 18].
zip()创建一个元组生成器,其中每个元组的每个元素都是您传递给它的参数之一的对应元素zip().
>>> list(zip(['a','b'], ['c','d']))
[('a', 'c'), ('b', 'd')]
Run Code Online (Sandbox Code Playgroud)
zip() 采用多个参数 - 如果您传递一个包含较小子列表的大型列表,结果会有所不同:
>>> list(zip([['a','b'], ['c','d']]))
[(['a', 'b'],), (['c', 'd'],)]
Run Code Online (Sandbox Code Playgroud)
而且一般不是我们想要的.但是,我们的values列表就是这样一个列表:包含子列表的大型列表.我们想要zip()那些子列表.这是使用*操作员的好时机.
该*运营商表示"解包"迭代.
>>> print(*[1,2,3])
1 2 3
>>> print(1, 2, 3)
1 2 3
Run Code Online (Sandbox Code Playgroud)
它也用于函数定义:
>>> def func(*args):
... return args
...
>>> func('a', 'b', [])
('a', 'b', [])
Run Code Online (Sandbox Code Playgroud)
因此,要创建字典,我们zip()将值列表放在一起,然后zip()使用键.然后我们遍历每个元组并从中创建一个字典,每个元组的第一个项目是键,第二个项目是值(转换为a list而不是a tuple).
要打印这个,我们可以创建一个大的循环结构,或者我们可以创建生成器(比完整的数据结构更快地组装和处理像a list)并迭代它们,大量使用*来解压缩.请记住,在Python 3中,print可以接受多个参数,如上所示.
我们将首先使用每个元素的位置keys作为关键字对字典进行排序.如果我们使用类似的东西key=len,它会将每个元素发送到len()函数并使用返回的长度作为键.我们使用lambda来定义一个内联,匿名函数,这需要一个参数x和return小号x的指数中list的keys.请注意,字典实际上没有排序; 我们只是设置它,以便我们可以根据排序顺序迭代它.
然后我们可以浏览这个排序的字典并将其元素组合成可打印的字符串.在顶层,我们将join()一个键的值分隔开来': '.每个值的元素都join()带有', '.请注意,如果元素不是字符串,我们必须将它们转换为字符串join()才能工作.
>>> list(map(str, [1,2,3]))
['1', '2', '3']
>>> print(*map(str, [1,2,3]))
1 2 3
Run Code Online (Sandbox Code Playgroud)
然后,使用运算符解包yield这些join()ed行中的每一个的生成器*,并将每个元素作为参数发送print(),指定'\n'(新行)的分隔符而不是默认' '(空格).
使用循环而不是理解是非常好的*,然后在逻辑运行后将它们重新排列成这样的结构,如果你愿意的话.在大多数情况下并不是特别必要.理解有时比等效循环执行得稍快,并且通过练习,您可能更喜欢理解的语法.但是要学习*操作员 - 这是一个用于定义功能的极其通用的工具.还要研究**(通常称为"双星"或"kwargs"),它将字典解包为关键字参数,也可用于定义函数.
| 归档时间: |
|
| 查看次数: |
7058 次 |
| 最近记录: |