说我有一个列表:
mylist = [element1, element2, element3, ...... ,elementn]
元素如下:
element1 = 'object1 = "value1" object2 = "value2" object3 = "value3"'
和所有其他元素相同,除了"value3"
将列表中的每个元素替换为element1,您将获得列表的外观。
我有一个字符串:
to_place = 'something_to_append'
我要在to_place
的末尾附加object1 = "value1"
,使它看起来像object1 = "value1something_to_append"
我尝试遍历每个元素,尝试找到value1
(与列表中的元素相同),并使用字符串附加函数,但是我只是没有得到想要的结果
任何帮助将不胜感激。 (我会在几分钟内上传我尝试过的代码,遇到一些麻烦)
编辑:添加代码:
element = [element1, element2, element3]
s = 'something_to_append'
for u in element:
if 'object1="value"' in u.split():
u = u + s
print(element)
对于输出,我得到的列表与以前相同。 附言:在Windows 10上的PyCharm上使用Python 2.7
答案 0 :(得分:1)
首先,字符串在python中是不可变的。因此,您永远无法在原处更改字符串-您只能复制它,对该副本进行某些操作并从中创建一个新字符串。在您的情况下,您可以定义一个函数为您完成此操作:
def insert_something(element, value, appendix):
index_after = element.find(value) + len(value)
return element[:index_after] + appendix + element[index_after:]
然后,遍历您的列表,对每个元素进行此操作,然后创建一个新列表(我敢肯定还有比这更优雅的方法,但这就是我想出的rn):
new_list = [insert_something(item, '"value1', to_place) for item in mylist]
编辑:
为了接近您自己的代码:您将要做的是使用enumerate
,因为您将要更改列表,这将影响元素的位置。可能看起来像这样:
element = [element1, element2, element3]
s = 'something_to_append'
for idx, u in enumerate(element):
if 'object1="value"' in u.split():
u = u[:-1] + s + '"'
element[idx] = u
这两种方法都能工作并返回您想要的东西,因此取决于您自己想要的更好:),尽管第一种方法是解决任何类似问题的更通用方法。
答案 1 :(得分:1)
您可以通过使用shlex.split
分割字符串来概括一下这一点,以便保留值部分中的空白,将值分配给dict,更新这些值,然后重建字符串,例如:
import shlex
from collections import OrderedDict
def f(text, **kwargs):
split = shlex.split(text)
d = OrderedDict(zip(split[::3], split[2::3]))
d.update((k, d[k] + v) for k, v in kwargs.items() if k in d)
return ' '.join('{} = "{}"'.format(k, v) for k, v in d.items())
然后将其用作:
element1 = 'object1 = "value1" object2 = "value2" object3 = "value3"'
updated_string = f(element1, object1='append here')
# 'object1 = "value1append here" object2 = "value2" object3 = "value3"'
可能希望考虑引入更多的鲁棒性检查,但应该与此处的其他答案一样有效。
答案 2 :(得分:0)
用正则表达式代替可能对您有用。在这里,我将其放在一个函数中以使其更易于使用:
import re
def append_to(in_value, value_to_search, value_to_append):
value_to_search = re.escape(value_to_search)
return re.sub(
'"({})"'.format(value_to_search),
'"\\1{}"'.format(value_to_append),
in_value,
)
my_list = [append_to(item, 'value3', 'something_to_append') for item in my_list]
答案 3 :(得分:0)
如果所有“ value1”都相同,则可能是一个更简单的答案:
mylist = [element1, element2, element3, ...... ,elementn]
to_place = "something_to_append"
newlist = [elem.replace("value1","value1"+to_place) for elem in mylist]
答案 4 :(得分:-1)
定义一个函数f
def f(x, y):
return x[:17] + y + x[17:]
然后做
>>> from pprint import pprint
>>> pprint(mylist)
['object1 = "value1" object2 = "value2" object3 = "value3"',
'object1 = "value1" object2 = "value2" object3 = "value3"',
'object1 = "value1" object2 = "value2" object3 = "value3"']
>>> to_place = 'something_to_append'
>>> new_list = [f(x, to_place) for x in mylist]
>>> pprint(new_list)
['object1 = "value1something_to_append" object2 = "value2" object3 = "value3"',
'object1 = "value1something_to_append" object2 = "value2" object3 = "value3"',
'object1 = "value1something_to_append" object2 = "value2" object3 = "value3"']