Соответствие шаблону из списка списков - PullRequest
0 голосов
/ 13 апреля 2020

Я работаю со списком списков и хочу сопоставить шаблоны в списках. Например, я показал список списков ниже.

 x = [[['a', 5],
      ['b', 0.11],
      ['c', 0.85]]
     [['a', 'b', 0.5],
      ['b', 'c', 1.0],
      ['c', 'a', 0.7]],
     [['a', 'b', 'c', 0.9],
      ['b', 'c', 'a', 0.4],
      ['a', 'c', 'b', 1.0]]]

Теперь я хочу дать ввод типа ("a", "b", "c"), тогда он должен дать мне соответствующее значение ex. 0,9 в списке выше.

Я пытался использовать

 if ["a","b","c"] in x : 
>>> False.

Но это не работает таким образом. Как я могу решить это? Пожалуйста, предложите любое решение.

Адитья.

Ответы [ 5 ]

2 голосов
/ 13 апреля 2020

Попробуйте этот код

x = [
     [['a', 5],['b', 0.11],['c', 0.85]],
     [['a', 'b', 0.5],['b', 'c', 1.0],['c', 'a', 0.7]],
     [['a', 'b', 'c', 0.9],['b', 'c', 'a', 0.4],['a', 'c', 'b', 1.0]]]

checklist = ['a', 'b', 'c']

return_value = [j[-1]   for i in x for j in i if j[:-1] == checklist][0]
print(return_value)

>> 0.9

с этим кодом, вы можете найти любой шаблон, который существует, изменив контрольный список, например checklist = ['a'] вывод будет 5

2 голосов
/ 13 апреля 2020

Списки не могут быть хешируемыми, вам нужно использовать tuple:

xx = {tuple(a[:-1]):a[-1]  for b in x for a in b}

if ('a','b','c') in xx: print(xx[('a','b','c')])
# 0.9
0 голосов
/ 13 апреля 2020
x = [
        [
            ['a', 5],
            ['b', 0.11],
            ['c', 0.85]
        ],
        [
            ['a', 'b', 0.5],
            ['b', 'c', 1.0],
            ['c', 'a', 0.7]
        ],
        [
            ['a', 'b', 'c', 0.9],
            ['b', 'c', 'a', 0.4],
            ['a', 'c', 'b', 1.0]
        ]
]

# Define search term as string
search = 'abc'
desired_value = None
for collection in x:
    for row in collection:
        # convert everything but the last element in each row to a string for easy comparison
        key = ''.join(row[:-1])
        # if you've found a key matching your search criterion, grab the last value for that row
        if search == key:
            desired_value = row[-1]
            break
0 голосов
/ 13 апреля 2020

Рекурсивный поиск независимо от уровней подсписков

Поскольку для постера требуется:

этот список является динамическим c и может иметь более 3 списков внутри

def find(lst, t, result = None):
  if not isinstance(t, list): # insure t is a list
    t = [t]

  if result is None:  # Set default result
    result = []

  for sublist in lst: # outer list loop
    if isinstance(sublist, list):
      if sublist[:-1] == t:
        result.append(sublist[-1])
        return result
      else:
        find(sublist, t, result) # recursively check sublists

  return result

x = [[['a', 5],
      ['b', 0.11],
      ['c', 0.85]],
     [['a', 'b', 0.5],
      ['b', 'c', 1.0],
      ['c', 'a', 0.7]],
     [['a', 'b', 'c', 0.9],
      ['b', 'c', 'a', 0.4],
      ['a', 'c', 'b', 1.0]],
    [[
      ['a', 'a', 'c', 2],    # additional level added
      ['x', 'a', 5]]]]

print(find(x, 'a'))              # [5]
print(find(x, ['a', 'b']))       # [0.5]
print(find(x, ['a', 'b', 'c']))  # [0.9]
print(find(x, ['a', 'a', 'c']))  # [2]
0 голосов
/ 13 апреля 2020

Первой мыслью было бы проверить, что все элементы ввода находятся в подсписке, например:

value = ['a', 'b', 'c']
for sublist in x:
    for part in sublist:
        if all(v in part for v in value):
            print(part)

Или, установив значение как set, вы можете проверить issubset

value = {'a', 'b', 'c'}
for sublist in x:
    for part in sublist:
        if value.issubset(set(part)):
            print(part)

Но это не смотрит на порядок, так как все строки, вы можете просто объединить элементы по частям и проверить, если abc в

value = 'abc'
for sublist in x:
    for part in sublist:
        if value in ''.join(map(str, part)):
            print(part)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...