2013-12-16 3 views
0

У меня есть словарь, состоящий из списков:вычитая элементы словаря

>>> triplets.get(k) 
[[1, 3, 15], [1, 3, 13], [1, 3, 11], [1, 3, 9], [1, 3, 8], [1, 3, 5], [1, 4, 15] 

, а также словари:

>>> cset1.get(k) 
[set([5])] 

>>> cset2.get(k) 
[[1, 8], [1, 9], [1, 11]] 

Я хочу, чтобы удалить элементы троек, которые содержат элемент cset1 или оба элементы cset2, т.е. хочу удалить [1,3,5], который содержит [5], а также [1, 3, 8], [1, 3, 9], [1, 3, 11], которые содержат оба элемента: cset2.

У меня есть следующий фрагмент кода (который не делает ничего вообще):

CDln = len(triplets.get(k)) 

for ii in range(CDln): 
    if cset1.get(k) in triplets.get(k)[ii] or cset2.get(k) in triplets.get(k)[ii]: 
    print "delete element of triplets in location:", ii 

Я не могу понять, как удалить эти элементы из словаря triplets (я использую print заявление как манекен чего я хочу).

+1

Не могли бы вы объяснить, что вы собираетесь достичь с помощью этого structe данных или откуда оно возникает? Просто чтобы избежать проблемы X-Y. – Hyperboreus

+0

@Hyperboreus, что такое X-Y-проблема? –

+1

@PaulDraper Задавая вопрос о X, пытаясь решить Y. – Hyperboreus

ответ

1

Я не совсем уверен, если я вас правильно, но посмотрите и комментарии, пожалуйста:

k = 42 #whatever 
triplets = {k: [[1, 3, 15], [1, 3, 13], [1, 3, 11], [1, 3, 9], [1, 3, 8], [1, 3, 5], [1, 4, 15]]} 
cset1 = {k: [set([5])]} 
cset2 = {k: [{1, 8}, {1, 9}, {1, 11}]} #changed this to sets 

triplets[k] = [x for x in triplets[k] if 
       all (y - set(x) for y in cset1[k]) and 
       all (y - set(x) for y in cset2[k]) 
       ] 
print(triplets[k]) 
+0

Спасибо, Гипербореус. Я запускал ваш код без проблем, но когда я использую свои данные, он отвечает: TypeError: неподдерживаемый тип операндов для -: 'list' и 'set'. Я не понимаю, почему, потому что cset1, cset2 и триплеты определяются как словари. – Augusto

+0

Я преобразовал cset2 (чтобы иметь ту же структуру, что и в cset1), в список списков множеств, а не списки списков. См. Комментарий в моем коде. Но вы можете просто заменить последнее 'y - set (x)' на 'set (y) - set (x)'. – Hyperboreus

0

Я не уверен, что ii, но я думаю, что это то, что вы хотите.

b = cset1[k] 
c = cset2[k] 
triplets[k] = filter(
    lambda lst: 
     any(lambda x: x in b, lst) or 
     any(lambda c1: all(lambda x: x in c1), c), 
    triplets[k] 
] 

Но:

Интересно, почему у вас есть cset1 и cset2. Кажется, как будто, вы просто должны иметь cset2, значение которого является

[[5], [1, 8], [1, 9], [1, 11]] 
+0

Спасибо, Пол. Я запустил ваш фрагмент кода, он отвечает: 'error: any() принимает ровно один аргумент (2 данный)' – Augusto

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