2016-02-02 3 views
1

Здесь мне нужно сравнить list1 элементы со списком 2 из 2-х предметов индекса, если элемент пропущен, тогда я хочу вставить False в пропущенный элемент index1.Python: список совпадений списка

Мой вход

list1 = [[1,2],[2,3],[3,4],[4,5]] 
list2 = [[1,[3,2]], [3,[2,1]], [4,[5,4]]] 

Освобожденные выход

result = [[3,[1,2]], [1,[2,3]], False, [4,[4,5]]] 

Я попытался это:

list1 = [[1,2],[2,3],[3,4],[4,5]] 
list2 = [[1,[3,2]], [3,[2,1]], [4,[5,4]]] 

sss = [] 
for x in list1: 
    sss.append([x for i in range(0, len(list2)) if set(x) == set(list2[i][1])]) 
print sss 

Пожалуйста, помогите мне с этим. Заранее спасибо ....

+1

Просьба пояснить, в чем заключается задача. –

ответ

0
def list_lolwut(list1, list2): 
    tmp = dict([(str(list(reversed(b))), [a, list(reversed(b))]) for a,b in list2]) 
    return [tmp.get(str(item), False) for item in list1] 

import unittest 

class Test(unittest.TestCase): 
    def test1(self): 
     list1 = [[1,2],[2,3],[3,4],[4,5]] 
     list2 = [[1,[3,2]], [3,[2,1]], [4,[5,4]]] 
     expected = [[3,[1,2]], [1,[2,3]], False, [4,[4,5]]] 
     self.assertEqual(expected, list_lolwut(list1, list2)) 

unittest.main() 
+0

Спасибо, брат! – Jothimani

+0

Я проверил это в списке1 [1,2] и list2 [3, [1,2]], он дает False .. – Jothimani

+0

Напишите его в качестве тестового примера test2 (self): ... –

0

Если вы хотите игнорировать приказ использовать frozenset сопоставьте все элементы list1 в frozensets и все вторые элементы из подсписков в list2, используйте OrderedDict сохранить порядок и найдите разницу между ними.

Когда вы знаете, что находится в списке1, которого нет в списке2, вы можете заархивировать OrderedDict с исходным списком, любой ключ из Ordereddict, который находится в разности наборов, означает, что вам нужно добавить False в этот индекс:

from collections import OrderedDict 
from itertools import chain 

# keep the order from list1 
od = OrderedDict.fromkeys(map(frozenset, list1)) 
# get what is in list1 that is not a second element from the sublists of list2 
diff = set(od.keys() - map(frozenset, map(itemgetter(1), list2))) 
# get the indexes that are different 
inds = {ind for ind, (k, ele) in enumerate(zip(od, list1)) if k in diff} 
# insert False at the correct indexes 
list2[:] = chain(*([False] + [sub] if i in inds else [sub] for i, sub in enumerate(list2))) 
print(list2) 

Выход:

[[1, [3, 2]], [3, [2, 1]], False, [4, [5, 4]]] 

frozenset будет работать для любого количества элементов не только два, реверсивный подсписка будет работать только на 2, если порядок не случилось, чтобы быть точно наоборот.

Смежные вопросы