2

我正在尝试根据以前的属性更改列表的某些元素。因为我需要分配一个中间变量,所以我认为这不能作为列表理解来完成。以下带有注释的代码是我想要实现的:

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修改后是错误的。

4

3 回答 3

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']
于 2012-11-22T19:17:36.663 回答
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']
于 2012-11-22T19:38:22.263 回答
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       

但它让我毛骨悚然地提出任何建议,对你将使用的整个数据集一无所知。

祝你好运,

麦克风

于 2012-11-22T19:53:05.053 回答