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

それはうまく機能せず、インデックス付けのために私にはPythonicではないように感じます。これを行うより良い方法はありますか?

具体例:

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

これは、提示したデータに対して機能するはずです。

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 に答える
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 に答える