1

関数に渡される文字列のリストが2つあります。それらは、特定の定型サブストリングを削除するために正規表現フィルターを通過したことを除いて、ほぼ同じです(たとえば、「BluesBrothersLLC」から「LLC」を削除します)。

この関数は、変更されたリストを内部的に重複排除し、変更されていないリストの関連アイテムを削除することを目的としています。これらのリストは、正規表現フィルターを実行する前にアルファベット順に並べ替えられ、同じ順序のままであると想定できます(つまり、original [x]!= modify [であっても、original[x]とmodified[x]は同じエンティティを参照します。バツ])。出力の2つのリスト間で相対的な順序を維持する必要があります。

これは私がこれまでに持っているものです。入力とボイラープレート文字列の非常にまれな組み合わせ(1000分の1)を除いて、99%の時間で機能し、一部の出力文字列は単一のリスト位置によって不一致になります。入力リストは「元の」および「変更された」です。

# record positions of duplicates so we're not trying to modify the same lists we're iterating
dellist_modified = []
dellist_original = []

# probably not necessary, extra precaution against modifying lists being iterated.
# fwiw the problem still exists if I remove these and change their references in the last two lines directly to the input lists
modified_copy = modified
original_copy = original

for i in range(0, len(modified)-1):
    if modified[i] == modified[i+1]:
dellist_modified.append(modified[i+1])
dellist_original.append(original[i+1])

for j in dellist_modified:
    if j in modified:
        del modified_copy[agg_match.index(j)]
        del original_copy[agg_match.index(j)]

# return modified_copy and original_copy

それは醜いです、しかしそれは私が得たすべてです。私のテストでは、問題はコードの最後のチャンクによって作成されていることが示されています。

変更またはまったく新しいアプローチをいただければ幸いです。次のステップは、辞書を使ってみることです。

4

3 に答える 3

2

これを行うためのクリーンな方法は次のとおりです。

original = list(range(10))
modified = list(original)
modified[5] = "a"
modified[6] = "a"

def without_repeated(original, modified):
    seen = set()
    for (o, m) in zip(original, modified):
        if m not in seen:
            seen.add(m)
            yield o, m

original, modified = zip(*without_repeated(original, modified))

print(original)
print(modified)

私たちに与える:

(0, 1, 2, 3, 4, 5, 7, 8, 9)
(0, 1, 2, 3, 4, 'a', 7, 8, 9)

両方のリストを同時に繰り返します。確認したアイテムのセットを保持し(セットの所有権を非常に高速にチェックします)、まだ確認していない結果を生成します。

その後、zipを再度使用して、2つのリストを返すことができます。

実際には次のように実行できることに注意してください。

seen = set()
original, modified = zip(*((o, m) for (o, m) in zip(original, modified) if m not in seen and not seen.add(m)))

これは、単一のジェネレータ式を使用することを除いて同じように機能し、条件ステートメントを使用してハッキングされたセットにアイテムを追加します(addは常にfalseを返すため、これを行うことができます)。ただし、この方法はかなり読みにくいので、一例として使用しないことをお勧めします。

于 2012-04-25T21:10:42.823 に答える
0

setPythonのAは、個別の要素のコレクションです。これらの要素の順序は重要ですか?このようなものが機能する可能性があります:

distinct = list(set(original))
于 2012-04-25T20:53:07.470 に答える
0

なぜ並列リストを使用するのですか?なぜクラスインスタンスの単一のリストではないのですか?これにより、物事を簡単にグループ化でき、リストの検索を減らすことができます。

于 2012-04-25T21:53:28.867 に答える