Python 在列表上迭代并连接相同类型的项
我通过Python 在列表上迭代并连接相同类型的项,python,string,list,Python,String,List,我通过list(string)将一堆字符串塞进列表中: 其中,listy看起来像: ['I', "'", 'v', 'e', ' ', '2', '4', 'g', 'o', 't', ' ', 'a', ' ', '6', '9'... 我正在寻找一种更简洁的方法来迭代列表,并且在不抛出任何单个字符条目的情况下,将所有整数连接在一起以生成: ['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697','l','o'.
list(string)
将一堆字符串塞进列表中:
其中,listy
看起来像:
['I', "'", 'v', 'e', ' ', '2', '4', 'g', 'o', 't', ' ', 'a', ' ', '6', '9'...
我正在寻找一种更简洁的方法来迭代列表,并且在不抛出任何单个字符条目的情况下,将所有整数连接在一起以生成:
['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697','l','o'...
整数在字符串中的位置是不可预测的,数字中的位数也是不可预测的(我可以运行到1或100000000)
要首先查找整数值,请考虑以下内容:
for i in listy:
if i.isdigit():
x = listy.index(i)
z = listy[x+1]
if z.isdigit():
…但那将是一场低效的血腥混乱
实际上,把这些数字放在一起会很容易,但我很难想出一个简洁的方法来检查每个数字。有什么建议吗?我会用(免责声明:我什么都用它.)
groupby
使用键函数将序列拆分为连续组。在本例中,我的键函数是c.isdigit()或c
,它将为数字返回True,为非数字返回字符。正如@gnibbler所指出的,我们也需要小心,不要意外地合并相邻字符
但在第二种情况下,我们不需要count
技巧:
>>> from itertools import groupby, chain
>>> gg = ([''.join(group)] if key else list(group) for key, group in groupby(sy, str.isdigit))
>>> list(chain.from_iterable(gg))
['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697', 'l', 'o', 'v', 'e', '-', 'a', '-', 'l', 'y', '2', ' ', 'b', 'u', 'n', 'c', 'h', ' ', 'o', 'f', ' ', '000', 'b', 'a', 'l', 'l', 'o', 'o', 'n', 's', '!']
我会使用(免责声明:我什么都用它)
groupby
使用键函数将序列拆分为连续组。在本例中,我的键函数是c.isdigit()或c
,它将为数字返回True,为非数字返回字符。正如@gnibbler所指出的,我们也需要小心,不要意外地合并相邻字符
但在第二种情况下,我们不需要count
技巧:
>>> from itertools import groupby, chain
>>> gg = ([''.join(group)] if key else list(group) for key, group in groupby(sy, str.isdigit))
>>> list(chain.from_iterable(gg))
['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697', 'l', 'o', 'v', 'e', '-', 'a', '-', 'l', 'y', '2', ' ', 'b', 'u', 'n', 'c', 'h', ' ', 'o', 'f', ' ', '000', 'b', 'a', 'l', 'l', 'o', 'o', 'n', 's', '!']
你可以很简单地用
如果你多次做这个操作,你应该考虑编译它,比如
>>> splitter = re.compile(r'\d+|.')
你可以很简单地用
如果你多次做这个操作,你应该考虑编译它,比如
>>> splitter = re.compile(r'\d+|.')
另一种方法是从反向列表(或堆栈)中弹出()个字符:
另一种方法是从反向列表(或堆栈)中弹出()个字符:
冒着被否决使用c风格解决方案(而不是pythonic列表comps)的风险,下面是一个易于阅读的解决方案:
>>> stringy = "I've 24got a 697love-a-ly2 bunch of 000coconuts!"
>>> x = list(stringy)
>>> i = 0
>>> l = []
>>> while i < len(x):
t = ''
while x[i].isdigit():
t += x[i]
i += 1
if t:
l.append(t)
i -= 1
else:
l.append(x[i])
i += 1
>>> l
['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697', 'l', 'o', 'v', 'e', '-', 'a', '-', 'l', 'y', '2', ' ', 'b', 'u', 'n', 'c', 'h', ' ', 'o', 'f', ' ', '000', 'c', 'o', 'c', 'o', 'n', 'u', 't', 's', '!']
>>>
>>stringy=“我有一堆697love-a-ly2的1000颗椰子!”
>>>x=列表(stringy)
>>>i=0
>>>l=[]
>>>而i>>l
[I'
>>>
唯一令人困惑的部分可能是
i-=1
。这就是为什么当内部while循环运行时,i
不会得到双增量,然后外部会再次增量。冒着使用c风格解决方案(而不是pythonic list comps)被否决的风险,下面是一个易于阅读的解决方案:
>>> stringy = "I've 24got a 697love-a-ly2 bunch of 000coconuts!"
>>> x = list(stringy)
>>> i = 0
>>> l = []
>>> while i < len(x):
t = ''
while x[i].isdigit():
t += x[i]
i += 1
if t:
l.append(t)
i -= 1
else:
l.append(x[i])
i += 1
>>> l
['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697', 'l', 'o', 'v', 'e', '-', 'a', '-', 'l', 'y', '2', ' ', 'b', 'u', 'n', 'c', 'h', ' ', 'o', 'f', ' ', '000', 'c', 'o', 'c', 'o', 'n', 'u', 't', 's', '!']
>>>
>>stringy=“我有一堆697love-a-ly2的1000颗椰子!”
>>>x=列表(stringy)
>>>i=0
>>>l=[]
>>>而i>>l
[I'
>>>
唯一令人困惑的部分可能是
i-=1
。就是这样,i
在内部while循环运行时不会得到双倍增量,然后外部会再次增量。啊,itertools,有什么你不擅长的吗?好。。。Python作为一种语言,任何东西都是惯用的。我并不是什么都使用groupby
。。但是当我看到一个问题说“我有一系列的foo,我想加入/group/不管是什么样的吧”,很难不立即思考groupby
。。有些人在遇到问题时,会思考“我知道,我会使用正则表达式。”现在他们有两个问题。有些人在遇到问题时会想“我知道,我会使用itertools。”现在他们有next(takewhile(not_u,count())
问题。这对sy=“我有一堆697love-a-ly2 000个气球不起作用!“
Nice fix摆脱lambdaAh itertools,有什么你不擅长的吗?好吧……Python作为一种语言,在习惯用法上可以做的任何事情。我不是什么都使用groupby
的……但是当我看到一个问题说“我有一个foo序列,我想加入/group/不管是什么样的“,很难不立即思考groupby
…有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题。有些人在遇到问题时会想“我知道,我会用itertools。”现在他们有了next(takewhile(not_uu,count())
问题。这不适用于sy=“我有一堆697love-a-ly2 000个气球!”
很好的解决办法摆脱lambda作为旁注:永远不要使用listy.index(I)
从值中获取索引。除了速度慢得多之外,它也不起作用。如果有两个元素的值为'2'
,索引('2')
总是会找到第一个元素。只需对x执行,我在enumerate(listy)中改为:
。作为旁注:永远,永远不要使用listy.index(i)
从
>>> stringy = "I've 24got a 697love-a-ly2 bunch of 000coconuts!"
>>> x = list(stringy)
>>> i = 0
>>> l = []
>>> while i < len(x):
t = ''
while x[i].isdigit():
t += x[i]
i += 1
if t:
l.append(t)
i -= 1
else:
l.append(x[i])
i += 1
>>> l
['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697', 'l', 'o', 'v', 'e', '-', 'a', '-', 'l', 'y', '2', ' ', 'b', 'u', 'n', 'c', 'h', ' ', 'o', 'f', ' ', '000', 'c', 'o', 'c', 'o', 'n', 'u', 't', 's', '!']
>>>