[英]Python - Checking every item in a list against every other item efficiently
[英]Python: Insert an item in a list every time some other item appears
虽然是一个过程,但我希望有一系列包含字符串的列表。 其中一些字符串将包含一个名为“foo”的 substring。 在所有这些位置,我想在此之前插入另一个字符串项 'bar'。
因此,如果
list1 = ['alpha', 'beta', 'gamma' , 'Donald-foo' , 'omega', 'foo Obama', 'football']
我想创建 list2 这是
list2 = ['alpha', 'beta', 'gamma' , 'bar', 'Donald-foo' , 'omega', 'bar', 'foo Obama', 'bar', 'football']
到目前为止,我已经尝试过:
list3 = [i for i,s in enumerate(list1) if 'foo' in s]
这给了我
list3 = [3, 5, 6]
for k in reversed(list3):
list1.insert(k,'bar')
这可以完成工作,但对于 go 来说,这感觉像是一种非常笨拙和痛苦的方式。 有没有更优雅的方法?
这会起作用:
[i for s in [*map(lambda x: (['bar', x] if 'foo' in x else [x]), list1)] for i in s]
['alpha',
'beta',
'gamma',
'bar',
'Donald-foo',
'omega',
'bar',
'foo Obama',
'bar',
'football']
对于list1
中的所有项目,如果找到'foo'
则返回['bar', 'item']
,否则返回 [ ['item']
。 那我就扁了。 这是未展平的部分:
[*map(lambda x: (['bar', x] if 'foo' in x else [x]), list1)]
[['alpha'],
['beta'],
['gamma'],
['bar', 'Donald-foo'],
['omega'],
['bar', 'foo Obama'],
['bar', 'football']]
这里是 go:
list2 = []
for item in list1:
if 'foo' in item:
list2.append('bar')
list2.append(item)
print(list2)
## -- End pasted text --
['alpha', 'beta', 'gamma', 'bar', 'Donald-foo', 'omega', 'bar', 'foo Obama', 'bar', 'football']
您可以通过以下方式轻松实现此目的:
list1 = ['alpha', 'beta', 'gamma' , 'Donald-foo' , 'omega', 'foo Obama', 'football']
list2 = []
for words in list1:
if 'foo' in words:
list2.append('bar')
list2.append(words)
list2 将是:
list2 = ['alpha', 'beta', 'gamma' , 'bar', 'Donald-foo' , 'omega', 'bar', 'foo Obama', 'bar', 'football']
列表理解的另一种简单方法(单行单循环):
from django.contrib.admin.utils import flatten
list1 = flatten([['bar',x] if 'foo' in x else x for x in list1])
list1
#['alpha', 'beta', 'gamma', 'bar', 'Donald-foo', 'omega', 'bar', 'foo Obama', 'bar', 'football']
只需在x
中存在 'foo' 的地方执行一个循环,将x
替换为['bar',x]
并最终展平以去除多余的括号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.