gpt4 book ai didi

python:将 "5,4,2,4,1,0"转换为 [[5, 4], [2, 4], [1, 0]]

转载 作者:太空狗 更新时间:2023-10-29 19:30:17 26 4
gpt4 key购买 nike

是否有一种“直接”的方式来转换包含将数字转换为 [x,y] 整数列表?

# from: '5,4,2,4,1,0,3,0,5,1,3,3,14,32,3,5'
# to: [[5, 4], [2, 4], [1, 0], [3, 0], [5, 1], [3, 3], [14, 32], [3, 5]]

顺便说一句,下面的工作,但不会称之为直截了当...此外,可以假设输入 str 已经过验证以确保它仅包含偶数个以逗号交错的数字。

num_str = '5,4,2,4,1,0,3,0,5,1,3,3,14,32,3,5'
numpairs_lst = [] # ends up as [[5, 4], [2, 4], [1, 0], ...]

current_num_str = '' # the current num within the str; stop when a comma is found
xy_pair = [] # this is one of the [x,y] pairs -> [5, 4]
for ix,c in enumerate(num_str):
if c == ',':
xy_pair.append(int(current_num_str))
current_num_str = ''
if len(xy_pair) == 2:
numpairs_lst.append(xy_pair)
xy_pair = []
else:
current_num_str += c

# and, take care of last number...
xy_pair.append(int(current_num_str))
numpairs_lst.append(xy_pair)

最佳答案

Python 中有两个重要的单行习惯用法有助于使这一过程“简单明了”。

第一个成语,使用zip() .来自 Python 文档:

The left-to-right evaluation order of the iterables is guaranteed. This makes possible an idiom for clustering a data series into n-length groups using zip(*[iter(s)]*n).

因此适用于您的示例:

>>> num_str = '5,4,2,4,1,0,3,0,5,1,3,3,14,32,3,5'
>>> zip(*[iter(num_str.split(","))]*2)
[('5', '4'), ('2', '4'), ('1', '0'), ('3', '0'), ('5', '1'),
('3', '3'), ('14', '32'), ('3', '5')]

这会产生每个长度为 2 的元组。

如果希望子元素的长度不同:

>>> zip(*[iter(num_str.split(","))]*4)
[('5', '4', '2', '4'), ('1', '0', '3', '0'), ('5', '1', '3', '3'),
('14', '32', '3', '5')]

第二个成语是list comprehensions .如果您希望子元素是列表,请包含一个理解:

>>> [list(t) for t in zip(*[iter(num_str.split(","))]*4)]
[['5', '4', '2', '4'], ['1', '0', '3', '0'], ['5', '1', '3', '3'],
['14', '32', '3', '5']]
>>> [list(t) for t in zip(*[iter(num_str.split(","))]*2)]
[['5', '4'], ['2', '4'], ['1', '0'], ['3', '0'], ['5', '1'], ['3', '3'],
['14', '32'], ['3', '5']]

任何不完整的子元素组将被 zip() 截断。因此,如果您的字符串不是 2 的倍数,例如,您将丢失最后一个元素。

如果您想返回不完整的子元素(即,如果您的 num_str 不是子元素长度的倍数)使用 slice idiom :

>>> l=num_str.split(',')
>>> [l[i:i+2] for i in range(0,len(l),2)]
[['5', '4'], ['2', '4'], ['1', '0'], ['3', '0'], ['5', '1'],
['3', '3'], ['14', '32'], ['3', '5']]
>>> [l[i:i+7] for i in range(0,len(l),7)]
[['5', '4', '2', '4', '1', '0', '3'], ['0', '5', '1', '3', '3', '14', '32'],
['3', '5']]

如果您希望每个元素都是一个 int,您可以在此处讨论的其他转换之前应用它:

>>> nums=[int(x) for x in num_str.split(",")]
>>> zip(*[iter(nums)]*2)
# etc etc etc

正如评论中所指出的,使用 Python 2.4+,您还可以将列表理解替换为 Generator Expression通过将 [ ] 替换为 ( ),如下所示:

 >>> nums=(int(x) for x in num_str.split(","))
>>> zip(nums,nums)
[(5, 4), (2, 4), (1, 0), (3, 0), (5, 1), (3, 3), (14, 32), (3, 5)]
# or map(list,zip(nums,nums)) for the list of lists version...

如果你的字符串很长,而且你知道你只需要 2 个元素,这会更有效。

关于python:将 "5,4,2,4,1,0"转换为 [[5, 4], [2, 4], [1, 0]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5083194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com