Есть ли эффективный способ найти общее значение двух элементов списка, при условии, что каждый должен содержать другое указанное значение? - PullRequest
0 голосов
/ 24 октября 2019

Эту проблему немного сложно кратко объяснить в одной строке вопроса, поэтому я начну с того, что дам свой код и скажу, что напечатанное значение - правильный результат:

valin = 4
valout = 3

gdict = {
        (0,3): 0,
        (1,3): 1,
        (2,3): 2,
        (0,4): 3,
        (4,3): 4,
        (0,5): 5,
        (5,4): 6,
        (4,6): 7,
        (6,3): 8,
        }

keys = list(gdict)
nin = [x for x in keys if x[0]==valin]
nout = [x for x in keys if x[1]==valout]

shared_val_from_vals = [x[1] for x in nin for y in nout if x[1]==y[0]][0]

print(shared_val_from_vals)
___________________________
6

У меня естьдва значения: валин и валут. Я ищу

  1. один ключ, где 0-й элемент равен валину, а
  2. другой ключ, где 1-й элемент равен значению и
  3. 1-й элемент первого ключа равен 0-му элементу второго ключа

Тогда я буду использовать это общее значение для другой части моего кода.

Хотя мой код получаетРабота сделана, этот код будет использоваться с большими словарями, поэтому я хотел бы оптимизировать эти операции, если смогу. Есть ли более питонический или вообще более краткий способ достижения этого результата?

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Зацикливание ключей словаря, создание наборов элементов кортежа, соответствующих каждому критерию. Затем пересечь два набора.

set_in = {}
set_out = {}
for in_var, out_var in gdict:
    if in_var == valin:
        set_out.append(out_var)
    if out_var == valout:
        set_in.append(in_var)
shared_val = set_in.intersect(set_out).pop()
0 голосов
/ 24 октября 2019

Вы можете сжать его только с помощью одного цикла for:

nin_out = [x for x in keys if x[0]==valin or x[1]==valout]
shared_val_from_vals = [x[1] for x in nin_out for y in nin_out if x[1]==y[0]][0]
...