2010-07-20 1 views
2

Моего примера словаря этоДоступ только часть словаря в для использования Python

data_dictionary = {1:'blue',2:'green',3:'red',4:'orange',5:'purple',6:'mauve'} 

data_dictionary может иметь несколько элементов, в зависимости от поступающих данных. Первое значение - это то, что мы называем payload_index. Я всегда получаю payload_index от 1 до 4.

Мне нужно собрать список из этого. Довольно легко:

for payload_index in data_dictionary : 
      assembled_packet.append(data_dictionary[payload_index]) 

Моя проблема в том, что мне нужно всегда пропускать третий элемент. Я думаю, если бы я мог сделать, но это было бы неэффективно:

for payload_index in data_dictionary : 
      if payload_index <> 3: 
       assembled_packet.append(data_dictionary[payload_index]) 

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

#get element 1 and two 
for index in range(0,3): 
      assembled_packet.append(data_dictionary[index]) 

#get element 1 and two 
for index in range(4,999): 
      assembled_packet.append(data_dictionary[index]) 

Любые идеи? Благодаря!

+1

Вы говорите, что 'if payload_index <> 3' неэффективен? Вы это оценили? – Gabe

+0

Словарь не обязательно в порядке - вы имеете в виду элемент с ключом 3? – Mark

+0

'Моя проблема в том, что мне нужно всегда пропускать третий элемент'. Имейте в виду, что у dicts нет порядка! – ChristopheD

ответ

6

неэффективен? Это кажется преждевременной оптимизацией! Просто используйте нормальный код:

for payload_index in data_dictionary: 
    if payload_index != 3: 
     assembled_packet.append(data_dictionary[payload_index]) 

или даже лучше:

assembled_packet = [data_dictionary[index] for index in data_dictionary if index != 3] 

Конечно, вы можете просто сделать:

>>> d = {1:'blue',2:'green',3:'red',4:'orange',5:'purple',6:'mauve'} 
>>> d.pop(3) 
'red' 
>>> list(d.values())  # in py3k; in python-2.x d.values() would do 
['blue', 'green', 'orange', 'purple', 'mauve'] 

P.S. <> давно устарел.

+3

+1. Через несколько месяцев после факта этот небольшой оператор «if», вероятно, сделает больше, чтобы сообщить о намерениях программиста, чем два странных цикла «для», которые просто пропускают элемент. – Faisal

+0

Любовь идея поп. Благодаря! –

+0

Мне нравится '<>' for 'not equal'. И обратите внимание, что это не ** устарело ** - это [устаревший] (http://docs.python.org/reference/expressions.html)! –

1

Для того, чтобы те, для циклов работы вы можете сделать это:

# Get the remaining elements 
size = len(data_dictionary) 
for index in range(4,size): 
      assembled_packet.append(data_dictionary[index]) 
0

Лучшим способом я могу думать:

output = [elem for elem in data_dictionary.items() if elem[0]!=3] 
0

от вас ответа не очевидно, если вы хотите, чтобы пропустить флиртует три предмета или только 3-й предмет. если прежний имеет место, и вы не уверены, что Ваши ключи всегда 1, 2, 3, вы можете сделать что-то вроде этого:

keys = list(sorted(data_dictionary.keys()))[3:] 
for payload_index in keys: 
    assembled_packet.append(data_dictionary[payload_index]) 
0

Моя проблема заключается Мне нужно всегда пропустить 3-й элемент. Я думаю, если бы я мог сделать, но это было бы неэффективно:

Это еще более неэффективен:

for payload_index in data_dictionary : 
    ... 
     assembled_packet.append(data_dictionary[payload_index]) 

Я хотел бы сделать это следующим образом (Python> = 2,5):

assembled.extend(color for (number, color) in data.iteritems() if number != 3) 

Для Python 3.x измените iteritems на элементы.

И не кодируйте имена/описания типов в именах переменных. Это зло.

+0

Спасибо. Это не имя типа, его значение вызывается за пределами этого контекста. –

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