Найти элемент по внутреннему кортежу в списке кортежа кортежей - PullRequest
1 голос
/ 27 мая 2020

Хорошо. Итак, я прошел через несколько ответов SO, таких как Найти элемент в списке кортежей в python, и они не кажутся такими c в моем случае. И я понятия не имею, как использовать их в своей проблеме.

Допустим, у меня есть список кортежей кортежей; то есть в списке хранится несколько точек данных, каждая из которых относится к декартовой точке. Каждый внешний кортеж представляет все данные точки. В этом кортеже есть внутренний кортеж, который и является точкой. То есть возьмем точку (1,2) и поставим 5, обозначающих какой-то смысл этой точки. Внешний кортеж будет ((1,2),5)

Что ж, легко понять, как это сгенерировать. Однако я хочу найти внешний кортеж на основе значения внутреннего кортежа. То есть я хочу сделать:

for y in range(0, 10):
    for x in range(0, 10):
        if (x, y) in ###:
            print("Found")

или что-то в этом смысле. Как это можно сделать?


Основываясь на предложении, опубликованном в качестве комментария @timgen, вот некоторые псевдодемонстрационные данные.
Список будет

selectPointSet = [((9, 2), 1), ((4, 7), 2), ((7, 3), 0), ((5, 0), 0), ((8, 1), 2)]

Так что я могу перебрать всю область точек, которая находится в диапазоне от (0,0) до (9,9), и сделать что-нибудь, если точка одна из точек в selectPointSet; т.е. если это (9, 2), (4, 7), (7, 3), (5, 0) или (8, 1)

Ответы [ 3 ]

1 голос
/ 27 мая 2020

Используя существующие структуры данных, вы можете сделать это следующим образом:

listTuple = [((1,1),5),((2,3),5)] #dummy list of tuples
for y in range(0, 10): 
    for x in range(0, 10):
        for i in listTuple:#loop through list of tuples
            if (x, y) in listTuple[listTuple.index(i)]:#test to see if (x,y) is in the tuple at this index
                print(str((x,y)) , "Found")

1 голос
/ 27 мая 2020

Создайте набор из двухэлементных кортежей для поиска O (1).

>>> data = [((1,2),3),((2,3),4),((6,7),4)]
>>> tups = {x[0] for x in data}

Теперь вы можете запрашивать tups с любым кортежем, который вам нравится.

>>> (6, 7) in tups
True
>>> (3, 2) in tups
False

Поиск значений от 0 до 9:

>>> from itertools import product
>>> for x, y in product(range(10), range(10)):
...     if (x, y) in tups:
...         print('found ({}, {})'.format(x, y))
...         
found (1, 2)
found (2, 3)
found (6, 7)

Если вам нужно сохранить информацию о третьем числе (а двухэлементные внутренние кортежи в data уникальны), вы также можете вместо этого создать словарь комплекта.

>>> d = dict(data)
>>> d
{(1, 2): 3, (2, 3): 4, (6, 7): 4}
>>> (2, 3) in d
True
>>> d[(2, 3)]
4
1 голос
/ 27 мая 2020

Вы можете использовать словарь.

temp = [((1,2),3),((2,3),4),((6,7),4)]
newDict = {}

# a dictionary with inner tuple as key
for t in temp:
    newDict[t[0]] = t[1]

for y in range(0, 10):
    for x in range(0, 10):
        if newDict.__contains__((x,y)):
            print("Found")

Надеюсь, это именно то, о чем вы просите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...