我有一份清单。此列表包含子列表。每个子列表都包含一个字符串。我想将.replace()
应用于这些字符串以更改字母。
mylist = [["aus"],["ausser"],["bei"],["mit"],["noch"],["seit"],["von"],["zu"]]
for sublist in mylist:
sublist = [stuff.replace("s", "Q") for stuff in sublist]
print(mylist)
但它只返回原始列表。它应该返回
[["auQ"],["auQQer"],["bei"],["mit"],["noch"],["Qeit"],["von"],["zu"]]
为什么我的代码不会改变我的子列表,即使我在for循环中重新定义它们?
答案 0 :(得分:3)
感谢@Hamms的评论:
原来不起作用的原因是因为当它分配时 新列表到子列表,它只是覆盖对子列表的引用 由for循环提供,而不是子列表本身。
此方法有效,因为它创建了一个全新的列表,而不是尝试修改原始列表:
mylist = [["aus"],["ausser"],["bei"],["mit"],["noch"],["seit"],["von"],["zu"]]
final = [j.replace("s", "Q") for k in mylist for j in k]
print(final)
输出:
['auQ', 'auQQer', 'bei', 'mit', 'noch', 'Qeit', 'von', 'zu']
或者您可以这样做以获得所需的输出:
mylist = [["aus"],["ausser"],["bei"],["mit"],["noch"],["seit"],["von"],["zu"]]
final = [[j.replace("s", "Q")] for k in mylist for j in k]
print(final)
输出:
[['auQ'], ['auQQer'], ['bei'], ['mit'], ['noch'], ['Qeit'], ['von'], ['zu']]
答案 1 :(得分:2)
你可以在一个班轮中做到这一点:
[[s.replace("s", "Q")] for l in mylist for s in l]
[['auQ'], ['auQQer'], ['bei'], ['mit'], ['noch'], ['Qeit'], ['von'], ['zu']]
但发生这种情况的原因是因为您反复创建新变量sublist
而不是分配给现有子列表。如果您想使用您的方法,请尝试以下方法:
for l in mylist:
l[0] = l[0].replace("s", "Q")
print(mylist)
[['auQ'], ['auQQer'], ['bei'], ['mit'], ['noch'], ['Qeit'], ['von'], ['zu']]
此处,子列表已就地修改(而不是创建新的修改后的子列表),而后者又会修改原始列表。
答案 2 :(得分:1)
使用map
的替代方案:
mylist = [["aus"],["ausser"],["bei"],["mit"],["noch"],["seit"],["von"],["zu"]]
secondList = list(map(lambda l: [l[0].replace('s', 'Q')], mylist)) # python 3
#secondList = map(lambda l: [l[0].replace('s', 'Q')], mylist) # python 2
>>> mylist
[['aus'], ['ausser'], ['bei'], ['mit'], ['noch'], ['seit'], ['von'], ['zu']]
>>> secondList
[['auQ'], ['auQQer'], ['bei'], ['mit'], ['noch'], ['Qeit'], ['von'], ['zu']]
答案 3 :(得分:0)
您可以使用
mylist = [["aus"],["ausser"],["bei"],["mit"],["noch"],["seit"],["von"],["zu"]]
for i in range(0,len(mylist)):
mylist[i] = [stuff.replace("s", "Q") for stuff in mylist[i]]
print(mylist)