Как назначить вызовы функций в пределах понимания списка - PullRequest
0 голосов
/ 03 октября 2018

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

Мой код ниже

out = []
for cluster in ClusterFile:
    cluster = list(cluster)
    for term in cluster[3]:
        for item in Interest:
            if term == item[0]:
                x = [item[1]]
                cluster.append(x)
                break
        out.append(cluster)
        break

Одна из моих многочисленных попыток:

out = [([item[1]]) for item in Interest for term in cluster[3] if term ==item[0] for cluster in ClusterFile]

Пример ввода:

cluster = [['a'], [1, 2], [3, 4], [['w'], ['x'], ['y'], ['z']], [5, 6]]

Interest = [['w', 'qx12'], ['y', 'qx19']]

Пример вывода:

[['a'], [1, 2], [3, 4], [['w'], ['x'], ['y'], ['z']], [5, 6], ['qx12', 'qx19']]

Кто-нибудь знает какие-либо ресурсы, которые могут помочь мне решить эту проблему?Я кодирую в Python 3

1 Ответ

0 голосов
/ 03 октября 2018

Хотя я согласен с @blacksite, что списочные определения - не самый читаемый способ, если это ваша цель, вот как это сделать:

cluster.append(
    [x[0] for x in [[item[1] for item in Interest if term[0] == item[0]] 
                    for cluster in ClusterFile for term in cluster[2]] 
     if len(x)]
)

cluster
# [['a'], [1, 2], [['w'], ['x'], ['y'], ['z']], [5, 6], ['qx12', 'qx19']]

Данные:

cluster = [['a'], [1, 2], [['w'], ['x'], ['y'], ['z']], [5, 6]]
ClusterFile = [cluster]
Interest = [['w', 'qx12'], ['y', 'qx19']]

Несколько замечаний:

  • Понимания вложенного списка работают в том же порядке, что и вложенные для циклов.Так что если у вас есть:

    for a in b:
        for x in a:
            f(x)
    

    , то это выглядит так:

    [f(x) for a in b for x in a]
    

    Это может показаться немного задом наперед, так как x in a находится далеко от начала оператора, гдеx привыкает.Просто подумайте об этом, как о порядке вложенных циклов.(В исходном коде он был задом наперед.)

  • Вы хотите cluster[2], а не cluster[3].

  • При выборе отдельных элементов в cluster[2], например, ['w'], ['x'] и т. Д., Вы сравнивали элемент list (['w']), представленныйterm против строки , содержащейся в этом списке ('w'), представленной item[0].Это не будет соответствовать, вам нужно term[0] вместо.
  • В последнем добавляемом окончательном списке (список x[0] с) отбрасывается несколько пустых списков, которые создаются при понимании внутреннего списка.Это не очень красиво, может быть, есть лучший способ сделать это.Но опять-таки, весь этот подход был бы более читабельным без списочных представлений, на мой взгляд.
...