検索を試みたことは約束しますが、見つけたすべての質問には、いくつかの基準が記載されていないか、違反しているため、回答が不十分になります。
リストを Python スクリプトに送信しています。そのリストはどこかに保存されますが、書き込みを最小限に抑えたいと思います (これはリモート サービス上にあり、書き込みごとに課金されます)。
listNew = ["some", "list", "sent", "in", "that", "may", "be", "different", "later", "some"]
listPrevious = ["some", "some", "list", "that", "was", "saved", "previously"]
(文字列であることに惑わされないでください。私のリストには実際に int が含まれています。)
シンプルで基本的なアルゴリズムは、インデックスごとに両方のリストを反復することです。項目が同じであれば、書く必要はありません。ブーム、お金が節約されました。ただし、最終的に保存されるデータは listNew である必要があります。
他の言語では、要素をインデックスで直接参照できました。
for (int i = 0; i < listNew.length; i++) {
// Have we exceeded the previous list's length? Time to just write data in.
if (listPrevious[i] == null)
listPrevious.append(listNew[i]);
continue;
if (listNew[i] != listPrevious[i])
listPrevious[i] = listNew[i]
}
残念ながら、ループ手法とリスト メソッドで私が見つけたものは提供しません。
要素を削除せずにインデックスで要素を取得する手段 (pop メソッド)、または
重複があるため、正確な値と位置によって要素のインデックスを取得する手段 (上記のコードでは、list.index("some") を使用すると listPrevious の最初のインデックスが返されますが、実際には最後を見ていますlistNew の要素)、または
リストの 1 つの長さを超えてリストを反復処理する手段 (zip() は、小さい方のリストの長さを超えて反復処理しないようです)。
これをどのように処理すべきかについてのアイデアはありますか? 以前の質問を検索すると、これらの 3 つの基準のいずれかが常に何らかの形で違反されていました。
ちなみに、私は次のような解決策を避けようとしていますが、これは他の質問でマークされた解決策の 1 つでもあります。
for newitem in listNew
for olditem in listPrevious
if newitem != olditem
# save the newitem
これは、listNew の要素を listPrevious のすべての要素と比較しますが、これは非効率的です。他のリストの同じインデックスに一致するかどうかを知る必要があるだけです。
------- コメントリクエストで
入力: listNew と listPrevious の 2 つのリスト。もう一つの例
- listNew = [100, 500, 200, 200, 100, 50, 700]
- listPrevious = [100, 500, 200, 400, 400, 50]
出力: listPrevious が listNew になりました。同じ要素を上書きする必要はありません。
listPrevious = [100, 500, 200, 200, 100, 50, 700]
書き込みを必要としませんでした: [100, 500, 200, _,, 50, _ _] <- 保存された 4 つの書き込み
書き込みが必要でした: [ _,, _ _, 200, 100, __, 700] <- 実行された .length 書き込みではなく、3 回の書き込みが実行されました!