【发布时间】:2012-11-11 05:06:04
【问题描述】:
我正在尝试根据以前的属性更改列表的某些元素。因为我需要分配一个中间变量,所以我认为这不能作为列表理解来完成。以下带有注释的代码是我想要实现的:
for H in header:
if "lower" in H.lower():
pref="lower"
elif "higher" in H.lower():
pref="higher"
if header.count(H) > 1:
# change H inplace
H = pref+H
我想出的最佳解决方案是:
for ii,H in enumerate(header):
if "lower" in H.lower():
pref="lower"
elif "higher" in H.lower():
pref="higher"
if header.count(H) > 1:
header[ii] = pref+H
它不太好用,而且因为索引,我觉得它不像 Python。有没有更好的方法来做到这一点?
具体例子:
header = ['LowerLevel','Term','J','UpperLevel','Term','J']
想要的输出:
header = ['LowerLevel','LowerTerm','LowerJ','UpperLevel','UpperTerm','UpperJ']
请注意,我的解决方案都不起作用:前者根本不会修改header,后者只会返回header = ['LowerLevel','LowerTerm','LowerJ','UpperLevel','Term','J']
因为修改后count是错误的。
【问题讨论】:
-
第一个版本有什么问题?
-
不起作用。
header的元素永远不会改变;H每次都会被覆盖。实际上,第二种方式也行不通。 -
第二个版本通常是就地修改列表的最佳方式。这是
enumerate的主要用途之一。这是完美的pythonic。 -
字符串是不可变的,因此您根本无法就地更改它们。您总是需要将元素重新分配给列表或创建一个新列表。