列表中字符串的就地修改?

时间:2012-11-22 19:13:35

标签: python list loops

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

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在修改后出错了。

3 个答案:

答案 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       

但它给了我一些建议的东西,不知道你会使用的整个数据集。

祝你好运,

麦克