Добавить пропущенные значения в список, сравнив другой список и наоборот - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь добавить отсутствующие значения в список, сравнивая другой список.Если данные отсутствуют в списке list_1, который есть в списке list_2, в том же индексе list_2 мы должны добавить «Missing» в список list_1

list_1 = [('state', 'YES', 'varchar'), ('quantity', 'YES', 'int')]

list_2 = [('name', 'NO', 'varchar'), ('marks', 'YES', 'varchar'), ('state', 'YES', 'int')]

ожидаемый вывод списков равен

list_1 = [("missing",),("missing",),('state', 'YES', 'varchar'), ('quantity', 'YES', 'int'))]

list_2 = [('name', 'NO', 'varchar'), ('marks', 'YES', 'varchar'), ('state', 'YES', 'int'),("missing",)]

Я пробовал ниже, но это не работает.

new_list1 = set(list1).difference(list2)
new_list2 = set(list2.difference(list1)

 for i in new_list1:
     for x in range(len(list_2)):
         if list_2[x][0] == i:
             list_1.insert(x, ("missing",))

 for i in new_list2:
          for x in range(len(list_1)):
         if list_1[x][0] == i:
             list_2.insert(x, ("missing",))

Кто-то поможет решить эту проблему

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

На самом деле невозможно определить общий порядок всех ключей из ваших двух списков, и из ваших комментариев порядок в любом случае не очень важен.Таким образом, было бы намного проще использовать словари вместо этого, сопоставляя ключ (первый элемент кортежей, который вы используете для определения равенства) с реальными кортежами.

>>> d1 = {a: (a,b,c) for a,b,c in list_1}                                   
>>> d2 = {a: (a,b,c) for a,b,c in list_2}                                   

Вы можете легко получить всеключи от обоих (или любого числа) диктиан и используют словарное понимание, чтобы получить окончательный диктант с «пропущенными» значениями.

>>> all_keys = set(d1) | set(d2)                                            
>>> {k: d1.get(k, "missing") for k in all_keys}                             
{'quantity': ('quantity', 'YES', 'int'),
 'marks': 'missing',
 'name': 'missing',
 'state': ('state', 'YES', 'varchar')}

И аналогично для list_2.Конечно, вы также можете использовать понимание списка.Будет сложнее узнать, какие элементы отсутствуют, но соответствующие элементы будут находиться в той же позиции, хотя не обязательно в тех же (относительных) позициях, что и в исходных списках.

>>> [d1.get(k, "missing") for k in all_keys]                               
[('quantity', 'YES', 'int'), 'missing', 'missing', ('state', 'YES', 'varchar')]
>>> [d2.get(k, "missing") for k in all_keys]                               
['missing', ('marks', 'YES', 'varchar'), ('name', 'NO', 'varchar'), ('state', 'YES', 'int')]
0 голосов
/ 17 июня 2019

Я не завершил это, используя вашу структуру кортежа, но общая идея должна быть такой же.

list1 = [1,2,3]
list2 = [0,1,7, 2,3]
new = []
for i in range(len(list2)):
    new += ["missing"]
    if list2[i] in list1:
        new[i] = list2[i]

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