从列表中的字符串中删除一个字符

4

我正在尝试为执行分析格式化一些数据。我想要从所有以'*'开头的字符串中删除它们。以下是数据的片段:

[['Version', 'age', 'language', 'Q1', 'Q2', 'Q3', 'Q4', 'Q5', 'Q6', 'Q7', 'Q8', 'Q9', 'Q10', 'Q11', 'Q12', 'Q13', 'Q14', 'Q15', 'Q16', 'Q17', 'Q18', 'Q19', 'Q20', 'Q21', 'Q22', 'Q23', 'Q24', 'Q25', 'Q26', 'Q27', 'Q28', 'Q29', 'Q30', 'Q31', 'Q32', 'Q33', 'Q34', 'Q35', 'Q36', 'Q37', 'Q38', 'Q39', 'Q40', 'Q41', 'Q42', 'Q43', 'Q44', 'Q45'], ['1', '18 to 40', 'English', '*distort', '*transfer', '*retain', 'constrict', '*secure', '*excite', '*cancel', '*hinder', '*overstate', 'channel', '*diminish', '*abolish', '*comprehend', '*tolerate', '*conduct', '*destroy', '*foster', 'direct', '*challenge', 'forego', '*cause', '*reduce', 'interrupt', '*enhance', '*misapply', '*exhaust', '*extinguish', '*assimilate', 'believe', 'harmonize', '*demolish', 'affirm', 'trouble', 'discuss', '*force', 'divide', '*remove', '*release', 'highlight', 'reinforce', 'stifle', '*compromise', '*experience', 'evaluate', 'replenish']]

这应该很简单,但是我尝试过的所有方法都不起作用。例如:

for lst in testList:
    for item in lst:
        item.replace('*', '')

只是把相同的字符串返回给我。我也尝试过插入if语句并索引字符串中的字符。我知道我可以访问这些字符串。例如,如果我说if item[0] == '*': print item,它就会打印出正确的项目。


阅读文档。replace 不是你想象中的那样。 - njzk2
5个回答

9

string是不可变的,因此item.replace('*','')会返回替换了字符的字符串,它并不会直接替换掉(这是不可能的,因为string是不可变的)。您可以枚举列表中的元素,然后将返回的字符串赋值回列表中-

例如 -

for lst in testList:
    for j, item in enumerate(lst):
        lst[j] = item.replace('*', '')

你也可以轻松使用列表推导式完成这个操作 -
testList = [[item.replace('*', '') for item in lst] for lst in testList]

谢谢Anand,这个代码非常好用。对于像我这样的新手来说,j、item、enumerate语法有些微妙,但我相信它们在未来会很有用。列表推导式是Python中美妙的事物之一,所以感谢您提供了额外的解决方案! - Pv L
感谢您向我介绍社区协议。 - Pv L

2

在需要更改列表元素的索引时,您可以尝试使用enumerate以便访问它:

 for lst in testList:
      for i, item in enumerate(lst):
          if item.startswith('*'):
               lst[i] = item[1:] # Or lst[i] = item.replace('*', '') for more

0

你需要创建一个新的list(如下所示),或者访问旧列表的索引。

new_list = [[item.replace('*','') if item[0]=='*' else item for item in l] for l in old_list]

0
y = []
for lst in testList:
    for a in lst:
        z = a.replace('*','')
        y.append(z)
testList = []
testList.append(y)
print testList

总是有一些解释会很有帮助。 - Bulat

0
在你的代码中,你只替换了虚拟变量中的*,而没有影响到列表条目。使用lstrip仅会从字符串左侧取出*
for x in xrange(len(testList)):
    testList[x] = testList[x].lstrip('*')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接