2

このコードは、この質問に対して受け取ったエレガントな回答に基づいており、最大 5 つの要素のネストされたリストを受け入れるようにスケールアップされています。全体的な目標は、インデックス位置 1 に繰り返し値を持つネストされたリストをマージすることです。

例外パスは、marker_array のネストされたリストに 4 つの要素がある場合、IndexError を抑制します。しかし、コードは最終出力の 4 つの要素リストの後に最後のリストを含めることができません。私の理解では、defaultdict の目的はそもそも IndexErrors を回避することでした。

# Nested list can have 4 or 5 elements per list. Sorted by [1]
marker_array = [
    ['hard','00:01','soft','tall','round'],
    ['heavy','00:01','light','skinny','bouncy'],
    ['rock','00:01','feather','tree','ball'],
    ['fast','00:35','pidgeon','random'],
    ['turtle','00:40','wet','flat','tail']]  

from collections import defaultdict
d1= defaultdict(list)
d2= defaultdict(list)
d3= defaultdict(list)
d4= defaultdict(list)

# Surpress IndexError due to 4 element list.
# Add + ' ' because ' '.join(d2[x])... create spaces between words.
try:
    for pxa in marker_array:
        d1[pxa[1]].extend(pxa[:1])
        d2[pxa[1]].extend(pxa[2] + ' ')
        d3[pxa[1]].extend(pxa[3] + ' ')
        d4[pxa[1]].extend(pxa[4] + ' ')

except IndexError:
    pass

# Combine all the pieces.
res = [[' '.join(d1[x]),
        x,
        ''.join(d2[x]),
        ''.join(d3[x]),
        ''.join(d4[x])]
        for x in sorted(d1)]

# Remove empty elements.
for p in res:
    if not p[-1]:
        p.pop()

print res

出力はほとんど私が必要とするものです:

[['hard heavy rock', '00:01', 'soft light feather ', 'tall skinny tree ', 'round bouncy ball '], ['fast', '00:35', 'pidgeon ', 'random ']]

このスケール アップ バージョンは、私のスキル レベルのせいで、確かに元のエレガンスの一部を失っています。このコードを改善するための一般的な指針は大歓迎ですが、重要度の高い順に 2 つの主な質問があります。

  1. ['turtle','00:40','wet','flat','tail'] ネストされたリストが無視されないようにするにはどうすればよいですか?
  2. 「ソフトライトフェザー」のように末尾の空白を避けるにはどうすればよいですか?
4

2 に答える 2