私は2つのリストを持っています、例えば:
keys1 = ['A', 'B', 'C', 'D', 'E', 'H', 'I']
keys2 = ['A', 'B', 'E', 'F', 'G', 'H', 'J', 'K']
両方のリストの順序を保持し、欠落している要素をそれらが属する場所に挿入して、重複のないマージされたリストを作成するにはどうすればよいですか?そのようです:
merged = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']
要素は等式と比較できますが、順序付けはできないことに注意してください(これらは複雑な文字列です)。要素を比較して並べ替えることはできませんが、元のリストでの出現に基づいて並べ替えられます。
矛盾する場合(両方の入力リストで順序が異なる)、すべての要素を含むすべての出力が有効です。もちろん、ソリューションがほとんどの注文を維持する上で「常識」を示している場合は、ボーナスポイントがあります。
繰り返しになりますが(一部のコメントはまだそれについて議論しています)、リストは通常、共通の要素の順序に関して互いに矛盾していません。その場合、アルゴリズムはそのエラーを適切に処理する必要があります。
.next()を使用してリストを反復処理し、一致しない要素を含むリストだけを進めるバージョンから始めましたが、.next()はいつ停止するかを知りません。
merged = []
L = iter(keys1)
H = iter(keys2)
l = L.next()
h = H.next()
for i in range(max(len(keys1, keys2))):
if l == h:
if l not in merged:
merged.append(l)
l = L.next()
h = H.next()
elif l not in keys2:
if l not in merged:
merged.append(l)
l = L.next()
elif h not in keys1:
if h not in merged:
merged.append(h)
h = H.next()
else: # just in case the input is badly ordered
if l not in merged:
merged.append(l)
l = L.next()
if h not in merged:
merged.append(h)
h = H.next()
print merged
.next()は最短リストの例外を引き起こすため、これは明らかに機能しません。これで、.next()を呼び出すたびに、その例外をキャッチするようにコードを更新できました。しかし、コードはすでにかなり非Python的であり、これは明らかにバブルを破裂させるでしょう。
これらのリストを反復処理して要素を組み合わせる方法について、より良いアイデアを持っている人はいますか?
一度に3つのリストでそれができればボーナスポイント。