3

可変量のリストの中から最初の共通リスト(この場合は座標のリスト)を見つけることができる必要があります。

つまり、このリスト

>>> [[[1,2],[3,4],[6,7]],[[3,4],[5,9],[8,3],[4,2]],[[3,4],[9,9]]]

戻る必要があります

>>> [3,4]

簡単であれば、座標を含むリスト間のすべての共通リスト(座標)のリストを操作できます。

リストはハッシュ化できないため、セットや辞書を使用できません(私は思いますか?)。

4

4 に答える 4

8

正解です。listオブジェクトは変更可能であるため、ハッシュ化できません。 tupleオブジェクトはハッシュ可能です(すべての要素がハッシュ可能である場合)。最も内側のリストはすべて整数であるため、リストの非ハッシュ化を回避する素晴らしい機会を提供します。

>>> lists = [[[1,2],[3,4],[6,7]],[[3,4],[5,9],[8,3],[4,2]],[[3,4],[9,9]]]
>>> sets = [set(tuple(x) for x in y) for y in lists]
>>> set.intersection(*sets)
set([(3, 4)])

ここでは、すべてのサブリストに存在する座標のタプルを含むセットを提供します。あなたが始めたようなリストのリストを取得するには:

[list(x) for x in set.intersection(*sets)]

トリックを行います。

@wimによる懸念に対処するために、交差点の最初の要素への参照が本当に必要な場合(ここで、は最初にあることで定義されます)、最も簡単な方法はおそらく次のようになります。firstlists[0]

#... Stuff as before
intersection = set.intersection(*sets)
reference_to_first = next( (x for x in lists[0] if tuple(x) in intersection), None ) 

None交差点が空の場合、これが返されます。

于 2013-02-18T03:43:36.370 に答える
1

すべての親リストに共通する最初の子リストを探している場合は、次のように機能します。

def first_common(lst):
    first = lst[0]
    rest = lst[1:]
    for x in first:
        if all(x in r for r in rest):
            return x
于 2013-02-18T03:53:47.480 に答える
0

再帰関数を使用したソリューション。:)

これは最初に複製された要素を取得します。

def get_duplicated_element(array):
    global result, checked_elements
    checked_elements = []
    result = -1
    def array_recursive_check(array):
        global result, checked_elements
        if result != -1: return
        for i in array:
            if type(i) == list:
                if i in checked_elements:
                    result = i
                    return
                checked_elements.append(i)
                array_recursive_check(i)
    array_recursive_check(array)
    return result

get_duplicated_element([[[1,2],[3,4],[6,7]],[[3,4],[5,9],[8,3],[4,2]],[[3,4],[9,9]]])
[3, 4]
于 2013-02-18T04:05:13.110 に答える
-1

リスト内包表記でこれを達成できます。

>>> l = [[[1,2],[3,4],[6,7]],[[3,4],[5,9],[8,3],[4,2]],[[3,4],[9,9]]]
>>> lcombined =  sum(l, [])
>>> [k[0] for k in [(i,lcombined.count(i)) for i in lcombined] if k[1] > 1][0]
[3, 4]
于 2013-02-18T04:42:48.513 に答える