my_list = ['cat','cow','dog','rabbit']
但我想要的是将一个字符(或字符串)追加/插入一个或多个元素(不是全部)。
类似
my_list = ['cat','cow_%s','dog_%s','rabbit']%('gives milk','bark')
现在更新的列表应该看起来像
my_list = ['cat','cow_gives milk','dog_bark','rabbit']
一种方法是手动逐个更改/更新元素
例如my_list[2]=my_list[2]+"bark"
但我不希望这样,因为my_list很长(大约100s元素),40+需要动态更改。
就我而言,就像
my_list = ['cat','cow_%s','dog_%s','rabbit']
for a in xyz: #a is a string and xyz is a list of string
my_list=my_list%(a,a+'b')
fun(my_list)
答案 0 :(得分:3)
你可以这样做:
changes = {"cow":"gives milk", "dog":"bark"}
my_list = [item if item not in changes else "_".join([item, changes[item]])
for item in my_list]
为了提高效率,如果你反复这样做,正如JAB在评论中建议的那样,建立一个字典来将项目映射到列表中的位置(索引):
locations = dict((s, i) for i, s in enumerate(my_list))
然后您可以使用它来查找相应的项目。
如果你坚持使用字符串列表,一些结尾"%s"
,以及要放入其中的内容列表,我猜你必须做类似的事情:
for i, s in enumerate(my_list): # work through items in list with index
if s.endswith("%s"): # find an item to update
my_list[i] = s % xyz.pop(0) # update with first item popped from xyz
请注意,xyz
必须是此列表,而不是元组,因为您不能从元组中pop
个项目。
答案 1 :(得分:0)
如果源字符串中有替换字符串,并且有可替换的替代字符串,那么您可以执行以下操作:
import re
def do_replacements(src, rep):
reps = iter(rep)
for item in src:
yield re.sub('%s', lambda m: next(reps), item)
replaces = ('gives milk','bark', 'goes walkies', 'eat stuff')
my_list = ['cat','cow_%s','dog_%s_and_%s','rabbit_%s']
print list(do_replacements(my_list, replaces))
# ['cat', 'cow_gives milk', 'dog_bark_and_goes walkies', 'rabbit_eat stuff']
如果您没有足够的替换,您将获得StopIteration
- 您可以考虑而不是错误,或者为替换提供默认(可能为空)替换:lambda m: next(reps, '')
实例...
答案 2 :(得分:0)
以下是两种可能性:或者,您可以在动物列表旁边创建一个动词列表,None
用于动物不会有动词,并将它们合并在一起......
animals = ['cat','cow','dog','rabbit']
verbs = [None, 'gives milk', 'barks', None]
def combine(animal, verb):
return (animal + "_" + verb) if verb else animal
print map(combine, animals, verbs)
...或者,如果动物已经拥有动词的%s
个占位符,则迭代动物,检查当前动物是否有占位符,如果是,请将其替换为下一个动词。 (与Jon的答案类似,但使用%
代替re.sub
)
animals = ['cat','cow_%s','dog_%s','rabbit']
verbs = iter(['gives milk', 'barks'])
print [animal % next(verbs) if '%' in animal else animal
for animal in animals]