我有一個對象列表。每個對象都是唯一的實例,由名稱和值的任意組合組成。我想將具有重複名稱的對象組合到同一個類的新實例中,其值是所有重複值的列表。這是我非常不Python的方法:在列表中組合重複對象是否有更多的pythonic方法?
def normalise_repeatable_options(options):
flat = {}
for o in options:
if isinstance(o, Option):
flat.setdefault(o.long, []).append(o)
# Ensure options stay in the order they were prescribed.
parsed = []
for o in options:
if isinstance(o, Option):
dups = flat.get(o.long)
if dups:
parsed.append(Option.combine(*tuple(dups)))
del flat[o.long]
else:
parsed.append(o)
return parsed
更新:輸入和預期輸出功能
input = [
Option('-f', '--filter', 1, 'merge file'),
Option('-f', '--filter', 1, 'merge anotherfile'),
Argument(None, 'a'),
Argument(None, 'b'),
Argument(None, 'c')
]
output = [
Option('-f', '--filter', 1, ['merge file', 'merge anotherfile']),
Argument(None, 'a'),
Argument(None, 'b'),
Argument(None, 'c')
]
我也包括了Object.combine
類方法,以防萬一你想知道是什麼,做:
@classmethod
def combine(class_, *opts):
t = opts[0]
if len(opts) == 1: return t
return class_(t.short, t.long, t.argcount, [o.value for o in opts])
可以提供樣品輸入/輸出? –
哪一個'option'輸入是'o.long'? – aIKid
長選項'--filter'。 – Craig