我正在尝试在python中切片列表,以便获得两个单独的列表:一个带有键,一个带有值。我的列表如下:
[(b'a', 2), (b'surprise,', 1), (b'but', 1), (b'welcome', 1), (b'one', 1), (b'for', 1), (b'sure.', 1)]
我在编码方面还比较陌生,所以我只是想知道我将如何做这样的事情。
答案 0 :(得分:4)
使用zip
解压缩数据:
>>> l = [(b'a', 2), (b'surprise,', 1), (b'but', 1), (b'welcome', 1), (b'one', 1), (b'for', 1), (b'sure.', 1)]
>>> [*zip(*l)] # similar to list(zip(*l))
[(b'a', b'surprise,', b'but', b'welcome', b'one', b'for', b'sure.'), (2, 1, 1, 1, 1, 1, 1)]
如果要使用列表而不是元组,请使用以下理解:
>>> [list(x) for x in zip(*l)]
[[b'a', b'surprise,', b'but', b'welcome', b'one', b'for', b'sure.'], [2, 1, 1, 1, 1, 1, 1]]
要解决l
为空列表的问题,可以将combition与or
表达式一起使用:
>>> keys, values = [*zip(*[])] or ([], [])
>>> keys
[]
>>> values
[]
答案 1 :(得分:3)
Netwave有一个非常正确的答案,但这是一种简单的方法:
鉴于:
data = [(b'a', 2), (b'surprise,', 1), (b'but', 1), (b'welcome', 1), (b'one', 1), (b'for', 1), (b'sure.', 1)]
您可以使用循环将其解包:
keylist = []
vallist = []
for item in data:
keylist.append(item[0])
vallist.append(item[1])
# You end up with keys in keylist and values in vallist
您还可以使用“元组拆包”将每个元组放入两个变量中:
keylist = []
vallist = []
for k,v in data:
keylist.append(k)
vallist.append(v)
# You end up with keys in keylist and values in vallist
您可以简化列表的理解:
keylist = [item[0] for item in data]
vallist = [item[1] for item in data]
只是令人讨厌,您也可以使用元组拆包:
kl,vl = [item[0] for item in data], [item[1] for item in data]
答案 2 :(得分:2)
由于您专门使用了“键”和“值”这两个术语,因此可以通过字典来做到这一点:
my_dict = dict(my_list)
my_keys = list(my_dict.keys())
my_values = list(my_dict.values())
如果您关心的只是某种(只读)可迭代的内容,请不要在list
中进行换行。
答案 3 :(得分:0)
使用map
:
l = [(b'a', 2), (b'surprise,', 1), (b'but', 1), (b'welcome', 1), (b'one', 1), (b'for', 1), (b'sure.', 1)]
l1, l2 = map(lambda x: x[0], l), map(lambda x: x[1], l)
print('l1 is: {}\nl2 is: {}'.format(list(l1), list(l2)))