0

私は2つのリストを持っています。1つは次の形式です。

[a1, b1, [[c1, d1, e1], [f1, g1, h1], etc, etc], etc]

もう1つは辞書で、そのエントリは次の形式になっています。

[[a2, b2, c2], [d2, e2, f2], etc, etc]

そこで、これら2つのサブリストの最初のエントリを比較して、同じものと、最初のエントリで2番目のサブリストにまったく表示されないものを見つける必要があります。

敵の例、もしc1 = d2、私が知りたいのですが、がまたはのf1どちらにも等しくない場合、私はそれを知りたいのです。a2d2

とにかく、私はこれを適切に実装するのに少し問題があります、どんな助けもいただければ幸いです。

ありがとう!

(リスト形式がどれほど明確に理解できるかわかりません。まだ混乱している場合は申し訳ありません)

コードサンプル:

for row in range(0, len(command[2])):

    counter = 0

    for nodeRows in range(0, len(nodeTable[command[0]])):

        if nodeTable[command[0]][nodeRows][0] == command[2][row][0]:

            if ((command[2][row][2]) + 1) < nodeTable[command[0]][nodeRows][2]:

                counter += 1

                newrow = command[2][row]
                newrow[1] = command[1]
                newrow[2] = newrow[2] + 1

                nodeTable[command[0]][nodeRows] = newrow

                change = 'true'

これは役に立たないと思います。コードは少しモノリシックです(そのため、最初は投稿しませんでした)。しかし、私は基本的に2つの値を比較しようとしています。別のリストの3番目の位置にあるリストの項目の最初の値と、別のリストに含まれているリストの項目の最初の値。

うーん...ごめんなさい。コードをもっと単純にしようとしましたが、少し複雑です。

4

2 に答える 2

3

あなたの問題を正しく理解しているかどうかはわかりませんが、試してみます。3 つの要素のすべてのサブリストの最初の要素のみを比較する必要があると思います。

最初にすべての最初の要素を分離してから、比較を行います。

doctestを含むコードを次に示します。これにより、求めていることが実行されるかどうかを確認できます。

def compare(l0, l1):
    """
    >>> l0 = [1, 2, [[10, 20, 30], [40, 50, 60], [70, 80, 90]], 3]
    >>> l1 = [[11, 21, 31], [41, 51, 61], [71, 81, 91]]
    >>> compare(l0, l1)
    ([], [10, 40, 70])

    >>> l0 = [1, 2, [[10, 20, 30], [40, 50, 60], [70, 80, 90]], 3]
    >>> l1 = [[10, 21, 31], [41, 51, 61], [71, 81, 91]]
    >>> compare(l0, l1)
    ([10], [40, 70])

    >>> l0 = [1, 2, [[10, 20, 30], [40, 50, 60], [70, 80, 90]], 3]
    >>> l1 = [[10, 21, 31], [40, 51, 61], [70, 81, 91]]
    >>> compare(l0, l1)
    ([10, 40, 70], [])
    """
    first_entries_l0 = [x[0] for x in l0[2]]
    first_entries_l1 = [x[0] for x in l1]

    equals = [x for x in first_entries_l0 if x in first_entries_l1]
    unique = [x for x in first_entries_l0 if x not in first_entries_l1]

    return equals, unique

コードをテストするには、コードを「code.py」ファイルにコピーして、次のように実行します。

python -m doctest code.py

セットを使用して1回だけループすることでより効率的にすることができますが、これで問題が解決するかどうかさえわからないので、あなたに任せます。

于 2012-11-06T22:45:48.307 に答える
1

答えは、現在のデータ構造を適切なものに変換することです。おそらく入力は自分で定義するので、醜い構造を処理するためのより良いコードを書くのではなく、構造を改善する必要があります。不適切な API に対して記述している場合は、API を有用な構造にマップします。

問題は定義にあるため、適切な回答を得るにはコード全体を投稿する必要があります。モジュール全体をリファクタリングしてやり直す必要があると思います。これは単純に悪いコードだからです。

いくつかのアイデア: コマンドはツリーでしょうか? 待ちリスト?マトリックス?クラス?アイテムの長さが異なるのはなぜですか? また、異なるサブアイテムを比較したいのはなぜですか? クラスとオーバーライドを使用してみてください__cmp__

于 2012-11-06T22:33:32.013 に答える