![](/img/trans.png)
[英]Within a list of dicts, convert in-place all datetime objects to strings?
[英]in-place modification of strings within a list?
我正在尝试根据以前的属性更改列表的某些元素。 因为我需要分配一个中间变量,所以我认为这不能作为列表理解来完成。 以下代码(带注释)是我要实现的目标:
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 = ['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']
使用生成器函数是这样的:
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']
这应该适用于您提供的数据。
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
但这使我无所适从地提出了任何建议,而不是只知道您将要使用的整个数据集。
祝好运,
麦克风
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.