2017-02-17 9 views
0

Надеюсь, вы все в порядке.Как проверить значение ключа в выражении if

Вот как выглядит мои данные:

dictionary1 = {2876: 1, 9212: 1, 953997: 1, 9205: 1, 9206: 1, 9207: 1, 9208: 1, 9209: 1, 9210: 1, 9211: 1, 6908: 1, 1532: 1, 945237: 1, 6532: 2, 6432: 4} 

data1 = [[2876, 5423],[2312, 4532],[953997, 5643]...] 

Я пытаюсь запустить заявление, которое выглядит следующим образом:

for y in data1: 
     if y[0] in dictionary1 and dictionary1[y[0]] == 1: 
      dictionary1[y[1]] = 2 

Предположительно, это позволит создать новый набор данных, глядя, как это:

dictionary1 = {5423: 2, 953997: 2, 2876: 1, 9212: 1, 953997: 1, 9205: 1, 9206: 1, 9207: 1, 9208: 1, 9209: 1, 9210: 1, 9211: 1, 6908: 1, 1532: 1, 945237: 1, 6532: 2, 6432: 4} 

Что я делаю неправильно? Является ли dictionary1 [y [0]] == 1 правильным способом проверки значения ключа?

Спасибо всем.

+2

Что случилось в результате? – hsfzxjy

ответ

0

словарь постижение преобразует список списков в словарь:

dict1 = {t[0]:t[1:] for t in dictionary1} 

Тогда это должно быть легко делать то, что вы хотите:

for y in data1: 
    if y in dict1 and dict1[y] ==1: 
     dictionary1[y] = 2 
+1

data1 - это список пар. –

+0

К сожалению. Misread it –

-1

и можно просто использовать

for y in data1: 
     if dictionary1.has_key(y[0]): 
      dictionary1[y[1]] = 2 

Надеюсь, это то, чего ищет ур.

0

Вы можете использовать dict.get(key, default), чтобы избежать исключения для отсутствующих значений и обеспечить безопасное значение по умолчанию. Это уменьшает цикл к одному условию:

#!python3 
dictionary1 = {2876: 1, 9212: 1, 953997: 1, 9205: 1, 9206: 1, 9207: 1, 9208: 1, 9209: 1, 9210: 1, 9211: 1, 6908: 1, 1532: 1, 945237: 1, 6532: 2, 6432: 4} 

data1 = [[2876, 5423],[2312, 4532],[953997, 5643]] 

for x,y in data1: 
    if dictionary1.get(x, 0) == 1: 
     dictionary1[y] = 2 

print(dictionary1) 

Вы можете использовать dict.update(other) навалом, перезаписать значения в dictionary1 с одним вкладышем Dict понимания:

dictcompr = {b:2 for a,b in data1 if dictionary1.get(a,0) == 1} 
dictionary1.update(dictcompr) 

И тогда вы можете объединить их в один сингл, нечестивы, неосновательный, едва читаемым беспорядок:

dictionary1.update({b:2 for a,b in data1 if dictionary1.get(a,0) == 1}) 

Обновление:

Чтобы удалить все ключи, имеющие значение 1, у вас есть выбор:

for k,v in dictionary1.items(): 
    if v == 1: 
     del dictionary1[k] 

# Versus: 

d2 = dict(filter(lambda item: item[1] != 1, dictionary1.items())) 
dictionary1 = d2 

# or 

dictionary1.clear() 
dictionary1.update(d2) 

Честно говоря, для ваших целей цикл for, вероятно, лучше. Подход filter может принимать лямбда в качестве параметра, чтобы настроить то, что фильтруется. Использование clear()/update() - победа, если вы ожидаете нескольких ссылок на словарь. То есть, A = B = dictionary1. В этом случае clear/update сохранит один и тот же базовый объект, поэтому связь все еще сохраняется. (Это также относится к петле for - благо исключительно для filter, который требует временного.)

+0

Кажется, это выглядит лучше, чем у меня!Два вопроса, предположим, что мои данные1 выглядят следующим образом: [[2876, 5423, 3], [2312, 4532, 4], [953997, 5643, 5]] ..., причем каждый список имеет третье значение, Не волнуйся. Как мне это сделать? Наконец, Есть ли когда-нибудь один раз, когда я создаю словарь [y] = 2, чтобы удалить все экземпляры, где словарь [x] == 1? Большое вам спасибо за помощь! –

+0

Вы можете использовать 'a, b, c', или вы можете использовать' a, b, * rest', если есть 3 или более значений (* rest будет поднимать * все * остальные значения). Что касается другого, вы хотите удалить каждый ключ, который имеет значение 1, или только те, которые указаны в списке data1? –

+0

Большое вам спасибо! Я хотел бы удалить каждый ключ, который имеет значение 1. –

0

пожалуйста, попробуйте это,

for y in data1: 
    if y[0] in dictionary1.keys() and dictionary1.keys() == y[0]: 
     dictionary1[y[1]] = 2 

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

  • Нет связанных вопросов^_^