Отфильтруйте вложенные списки по первому элементу в них

#python #python-3.x #list

Вопрос:

Я хочу фильтровать вложенные списки на основе первого элемента в каждом списке. У меня есть следующие вложенные списки:

 # 'nom' is duplicated
input1 = [
    ['nom', 'N', 'eye'],
    ['nom', 'N', 'face'],
    ['acc', 'E', 'computer'],
    ['dat', 'C', 'screen']
    ]

# 'acc' is duplicated
input2 = [
    ['nom', 'O', 'heart'],
    ['acc', 'O', 'root'],
    ['acc', 'C', 'life'],
    ['dat', 'E', 'evidence']
    ]

# No duplicates
input3 = [
    ['nom', 'O', 'author'],
    ['acc', 'O', 'tear'],
    ]
 

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

 # From input1
# keep ['nom', 'N', 'eye']
# delete ['nom', 'N', 'face']
output1 = [
    ['nom', 'N', 'eye'],
    ['acc', 'E', 'computer'],
    ['dat', 'C', 'screen']
    ]

# From input2
# keep ['acc', 'O', 'root']
# delete ['acc', 'C', 'life']
output2 = [
    ['nom', 'O', 'heart'],
    ['acc', 'O', 'root'],
    ['dat', 'E', 'evidence']
    ]

# From input3
# keep every child list since there is no duplicate
output3 = [
    ['nom', 'O', 'author'],
    ['acc', 'O', 'tear'],
    ]
 

Как я должен добиться этого с помощью python3?

Ответ №1:

Если вы используете Python 3.6 или новее, вы можете использовать тот факт, что dict сохраняете порядок вставки. Повторите список в обратном порядке и вставьте его в a dict , а затем измените значения

 def filter_list(lst):
    d = {lst[i][0]: lst[i] for i in range(len(lst) - 1, -1, -1)}
    return list(reversed(d.values()))

input1 = filter_list(input1)
print(input1) # [['nom', 'N', 'face'], ['acc', 'E', 'computer'], ['dat', 'C', 'screen']]