在列表中分割列表?

2024-04-18 17:51:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在python中对一个列表进行切片,以便得到两个独立的列表:一个带有键,另一个带有值。我的清单如下:

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

我是一个比较新的编码,所以我只是想知道如何才能做到这样的事情。你知道吗


Tags: 编码列表for切片事情onebutsurprise
3条回答

由于您专门使用“键”和“值”这两个术语,因此可以通过字典来实现:

my_dict = dict(my_list)
my_keys = list(my_dict.keys())
my_values = list(my_dict.values())

如果您关心的只是某种类型的(只读)iterable,那么不要费心用list包装。你知道吗

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]

使用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是否为空列表,可以使用带有or表达式的组合:

>>> keys, values = [*zip(*[])] or ([], [])
>>> keys
[]
>>> values
[]

相关问题 更多 >