【发布时间】:2020-05-14 22:34:34
【问题描述】:
我想知道是否可以将枚举的字符串拆分为列表。这是我所拥有的:
"1 hello 2 goodbye 3 fun 4 etc"
并想将其转换为:
["1 hello", "2 goodbye", "3 fun", "4 etc"]
感谢您的帮助!
【问题讨论】:
我想知道是否可以将枚举的字符串拆分为列表。这是我所拥有的:
"1 hello 2 goodbye 3 fun 4 etc"
并想将其转换为:
["1 hello", "2 goodbye", "3 fun", "4 etc"]
感谢您的帮助!
【问题讨论】:
除了@Mario Ishac 答案,如果您在 2 个数字之间有 2 个单词,您可以使用 regex 拆分数字:
import re
x = "1 hello world 2 goodbye 3 fun 4 etc"
x = re.split(r'(\d+)', x)[1:]
c = list(map("".join, zip(x[::2], x[1::2])))
print(c) # ['1 hello world ', '2 goodbye ', '3 fun ', '4 etc']
【讨论】:
it = iter(s.split())
li = [a + ' ' + b for a,b in zip(it, it)]
或
it = iter(s.split())
li = list(map(' '.join, zip(it, it)))
或
li = list(map(' '.join, zip(*(2 * [iter(s.split())] )) ))
zip 通常从迭代器中提取元素并按元素顺序将它们打包成元组,因此第一个元组包含所有第一个元素,第二个元组包含所有第二个元素,依此类推。但是在这种情况下 zip 两次获得相同的迭代器,因此对于每次迭代,都是从同一个迭代器中提取两次,这产生的不是元素编号 i, i 而是 i, i+1 这是“grouper”配方的一个特例,它你可以在这里找到:https://docs.python.org/3/library/itertools.html
【讨论】:
具有regex 和list comprehension 的更强大的变体。
使用正则表达式(\d+\D+) 和re.findall() 可以拆分多个单词的枚举字符串。
List comprehension 用于空格分割。
import re
x = '1 hello world 2 goodbye 3 fun 4 etc'
y = [c.strip() for c in re.findall(r"(\d+\D+)", x)]
print(y)
输出是
['1 hello world', '2 goodbye', '3 fun', '4 etc']
【讨论】:
你可以使用list comprehension:
In [516]: x = "1 hello 2 goodbye 3 fun 4 etc"
In [517]: x = x.split(' ')
In [519]: [" ".join(x[i:i+2]) for i in range(0, len(x), 2)]
Out[519]: ['1 hello', '2 goodbye', '3 fun', '4 etc']
或使用regex:
In [520]: import re
In [521]: x = "1 hello 2 goodbye 3 fun 4 etc"
In [523]: re.findall("[^ ]+ [^ ]+", x)
Out[523]: ['1 hello', '2 goodbye', '3 fun', '4 etc']
【讨论】:
这是使用zip的解决方案:
a = "1 hello 2 goodbye 3 fun 4 etc"
a = a.split()
numbers = a[::2]
words = a[1::2]
b = [number + " " + word for number, word in zip(numbers, words)]
b 最终成为 ['1 hello', '2 goodbye', '3 fun', '4 etc']
您也可以这样分配b:
b = map(" ".join, zip(numbers, words))
在这种情况下,b 是一个迭代器(并且连接操作是延迟应用的)。 list(b) 将是 ['1 hello', '2 goodbye', '3 fun', '4 etc']。
【讨论】: