在列表中切片列表?

时间:2019-04-30 02:52:46

标签: python

我正在尝试在python中切片列表,以便获得两个单独的列表:一个带有键,一个带有值。我的列表如下:

[(b'a', 2), (b'surprise,', 1), (b'but', 1), (b'welcome', 1), (b'one', 1), (b'for', 1), (b'sure.', 1)]

我在编码方面还比较陌生,所以我只是想知道我将如何做这样的事情。

4 个答案:

答案 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)))