繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM