1

検索を試みたことは約束しますが、見つけたすべての質問には、いくつかの基準が記載されていないか、違反しているため、回答が不十分になります。

リストを 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]
}

残念ながら、ループ手法リスト メソッドで私が見つけたものは提供しません。

  1. 要素を削除せずにインデックスで要素を取得する手段 (pop メソッド)、または

  2. 重複があるため、正確な値と位置によって要素のインデックスを取得する手段 (上記のコードでは、list.index("some") を使用すると listPrevious の最初のインデックスが返されますが、実際には最後を見ていますlistNew の要素)、または

  3. リストの 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 回の書き込みが実行されました!

4

4 に答える 4

3

あなたのCコードから、私は以下を作成しました。うまくいけば、それはあなたが望むことをします:

for i in range(len(listNew)):
    # Have we exceeded the previous list's length? Time to just write data in.
    if i >= len(listPrevious):
        listPrevious.append(listNew[i])
        continue

    if listNew[i] != listPrevious[i]:
        listPrevious[i] = listNew[i]
于 2012-10-09T22:20:35.507 に答える
2

インデックスを順番に繰り返したい場合は、次のものが必要ですenumerate

for idx, item in enumerate(mylist):
  # idx is the 0-indexed value where item resides in mylist.

Python で物事のペアを反復処理する場合は、次を使用しますzip

for a, b in zip(newlist, oldlist):
  # items a and b reside at the same index in their respective parent lists.

アプローチを組み合わせることができます。

for idx, (a, b) in enumerate(zip(newlist, oldlist)):
  # here you have everything you probably need, based on what I can 
  # tell from your question.

データ セットによっては、itertoolsモジュールの追加関数、具体的にはizip_longest.

于 2012-10-09T22:23:45.650 に答える
1

Python のリスト メソッドは、実際には提供していないと思われるすべての機能を提供します(最後のコード サンプルはサンプル コードと同等です)

  1. 要素を削除せずにインデックスで取得する手段 (pop メソッド)

    >>> data = ['a', 'b', 'c']
    >>> data[1]        # accessing an element by index
    'b'
    
  2. 重複があるため、正確な値と位置によって要素のインデックスを取得する手段 (上記のコードでは、list.index("some") を使用すると listPrevious の最初のインデックスが返されますが、実際には最後を見ていますリストの要素New)

    >>> data = ['a', 'b', 'c', 'b', 'a']
    >>> data.index('a')     # without a start arg, call finds the first index
    0
    >>> data.index('a', 1)  # you can find later indices by giving a start index
    4
    
  3. リストの 1 つの長さを超えてリストを反復処理する手段 (zip() は、小さい方のリストの長さを超えて反復処理しないようです)。

    for i, item in enumerate(listNew):    # loops over indices and values
        if i >= len(listPrevious):
            listPrevious.append(item)
            continue
    
        if item != listPrevious[i]:
            listPrevious[i] = item
    
于 2012-10-09T22:26:49.237 に答える
0

アイテムの位置は重要ですか?

そうでない場合は、単にこれを行います::

for n in NewList:
    if n not in OldList:
        OldList.append(n)
        process(n)
于 2012-10-09T22:25:25.227 に答える