我正在尝试根据以前的属性更改列表的某些元素。因为我需要分配一个中间变量,所以我不认为这可以作为列表理解来完成。以下代码,带有注释,是我正在努力实现的目标:
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
由于编制索引,它不起作用,并且对我来说感觉不那么pythonic。有更好的方法吗?
具体例子:
header = ['LowerLevel','Term','J','UpperLevel','Term','J']
期望的输出:
header = ['LowerLevel','LowerTerm','LowerJ','UpperLevel','UpperTerm','UpperJ']
请注意,我的解决方案都不起作用:前者从不修改header
,后者只返回
header = ['LowerLevel','LowerTerm','LowerJ','UpperLevel','Term','J']
因为count
在修改后出错了。
答案 0 :(得分:2)
header = ['LowerLevel','Term','J','UpperLevel','Term','J']
prefixes = ['lower', 'upper']
def prefixed(header):
prefix = ''
for h in header:
for p in prefixes:
if h.lower().startswith(p):
prefix, h = h[:len(p)], h[len(p):]
yield prefix + h
print list(prefixed(header))
我真的不知道这比你的好。这是不同的 ......
$ ./lower.py
['LowerLevel', 'LowerTerm', 'LowerJ', 'UpperLevel', 'UpperTerm', 'UpperJ']
答案 1 :(得分:2)
这样的东西,使用生成器函数:
In [62]: def func(lis):
pref=""
for x in lis:
if "lower" in x.lower():
pref="Lower"
elif "upper" in x.lower():
pref="Upper"
if header.count(x)>1:
yield pref+x
else:
yield x
....:
In [63]: list(func(header))
Out[63]: ['LowerLevel', 'LowerTerm', 'LowerJ', 'UpperLevel', 'UpperTerm', 'UpperJ']
答案 2 :(得分:2)
这应该适用于您提供的数据。
from collections import defaultdict
def find_dups(seq):
'''Finds duplicates in a sequence and returns a dict
of value:occurences'''
seen = defaultdict(int)
for curr in seq:
seen[curr] += 1
d = dict([(i, seen[i]) for i in seen if seen[i] > 1])
return d
if __name__ == '__main__':
header = ['LowerLevel','Term','J','UpperLevel','Term','J']
d = find_dups(header)
for i, s in enumerate(header):
if s in d:
if d[s] % 2:
pref = 'Upper'
else:
pref = 'Lower'
header[i] = pref + s
d[s] -= 1
但它给了我一些建议的东西,不知道你会使用的整个数据集。
祝你好运,麦克