在Python中动态地将值/字符串附加/插入到列表元素中?

时间:2014-01-17 15:14:59

标签: python python-2.7 python-3.x

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)

3 个答案:

答案 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]