可変量のリストの中から最初の共通リスト(この場合は座標のリスト)を見つけることができる必要があります。
つまり、このリスト
>>> [[[1,2],[3,4],[6,7]],[[3,4],[5,9],[8,3],[4,2]],[[3,4],[9,9]]]
戻る必要があります
>>> [3,4]
簡単であれば、座標を含むリスト間のすべての共通リスト(座標)のリストを操作できます。
リストはハッシュ化できないため、セットや辞書を使用できません(私は思いますか?)。
可変量のリストの中から最初の共通リスト(この場合は座標のリスト)を見つけることができる必要があります。
つまり、このリスト
>>> [[[1,2],[3,4],[6,7]],[[3,4],[5,9],[8,3],[4,2]],[[3,4],[9,9]]]
戻る必要があります
>>> [3,4]
簡単であれば、座標を含むリスト間のすべての共通リスト(座標)のリストを操作できます。
リストはハッシュ化できないため、セットや辞書を使用できません(私は思いますか?)。
正解です。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による懸念に対処するために、交差点の最初の要素への参照が本当に必要な場合(ここで、は最初にあることで定義されます)、最も簡単な方法はおそらく次のようになります。first
lists[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
交差点が空の場合、これが返されます。
すべての親リストに共通する最初の子リストを探している場合は、次のように機能します。
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
再帰関数を使用したソリューション。:)
これは最初に複製された要素を取得します。
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]
リスト内包表記でこれを達成できます。
>>> 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]