1

よく書かれていませんが、このコードは次のとおりです。

marker_array = [['hard','2','soft'],['heavy','2','light'],['rock','2','feather'],['fast','3'], ['turtle','4','wet']]
marker_array_DS = []

for i in range(len(marker_array)):
    if marker_array[i-1][1] != marker_array[i][1]:            
        marker_array_DS.append(marker_array[i])

print marker_array_DS

戻り値:

[['hard', '2', 'soft'], ['fast', '3'], ['turtle', '4', 'wet']]

これは、インデックス [1] に重複する値を持つリストを除くすべてのネストされたリストを含む新しいリストを作成するタスクの一部を実行します。しかし、私が本当に必要としているのは、削除されたリストから一致するインデックス値を連結して、次のようなリストを作成することです。

[['hard heavy rock', '2', 'soft light feather'], ['fast', '3'], ['turtle', '4', 'wet']]

インデックス [1] の値は連結できません。別の投稿のヒントを使用して、なんとか連結部分を実行できました。

newlist = [i + n for i, n in zip(list_a, list_b]

しかし、私は望ましい結果を生み出す方法を理解するのに苦労しています。「marker_array」リストは、このコードに渡される前にすでに昇順でソートされています。インデックス [1] 位置の類似値はすべて連続します。上記のように、一部のネストされたリストには [0] と [1] を超える値がない場合があります。

4

5 に答える 5

2

それをすばやく突き刺します...itertools.groupbyグループ化を行うために使用しますが、2要素リストを3要素に変換するジェネレーターで行います。

from itertools import groupby
from operator import itemgetter

marker_array = [['hard','2','soft'],['heavy','2','light'],['rock','2','feather'],['fast','3'], ['turtle','4','wet']]  

def my_group(iterable):
    temp = ((el + [''])[:3] for el in marker_array)
    for k, g in groupby(temp, key=itemgetter(1)):
        fst, snd = map(' '.join, zip(*map(itemgetter(0, 2), g)))
        yield filter(None, [fst, k, snd])

print list(my_group(marker_array))
于 2013-06-24T22:52:54.503 に答える
1
from collections import defaultdict
d1 = defaultdict(list)
d2 = defaultdict(list)
for pxa in marker_array:
    d1[pxa[1]].extend(pxa[:1])
    d2[pxa[1]].extend(pxa[2:])

res = [[' '.join(d1[x]), x, ' '.join(d2[x])] for x in sorted(d1)]

本当に 2 タプルが必要な場合 (可能性は低いと思います):

for p in res:
    if not p[-1]:
        p.pop()
于 2013-06-24T22:56:38.197 に答える
-1

に基づく別のソリューションitertools.groupby:

from itertools import groupby

# normalizes the list of markers so all markers have 3 elements
def normalized(markers):
    for marker in markers:
        yield marker + [""] * (3 - len(marker))

def concatenated(markers):
  # use groupby to iterator over lists of markers sharing the same key
  for key, markers_in_category in groupby(normalized(markers), lambda m: m[1]):
    # get separate lists of left and right words
    lefts, rights = zip(*[(m[0],m[2]) for m in markers_in_category])
    # remove empty strings from both lists
    lefts, rights = filter(bool, lefts), filter(bool, rights)
    # yield the concatenated entry for this key (also removing the empty string at the end, if necessary)
    yield filter(bool, [" ".join(lefts), key, " ".join(rights)])

ジェネレーターconcatenated(markers)は結果を生成します。このコードは['fast', '3']ケースを正しく処理し、そのような場合に追加の 3 番目の要素を返しません。

于 2013-06-24T23:43:02.450 に答える