Мой пример словарь это

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])

Любые идеи? Благодарность!

2
William T Wild 20 Июл 2010 в 21:12

5 ответов

Лучший ответ

< EM> неэффективный ? Это похоже на преждевременную оптимизацию! Просто используйте обычный код:

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']

Постскриптум <> давно устарел.

6
SilentGhost 20 Июл 2010 в 17:28

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

keys = list(sorted(data_dictionary.keys()))[3:]
for payload_index in keys:
    assembled_packet.append(data_dictionary[payload_index])
0
mykhal 20 Июл 2010 в 17:31

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

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

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 измените его элементы на элементы.

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

0
pillmuncher 20 Июл 2010 в 19:01

Лучший способ, который я могу придумать:

output = [elem for elem in data_dictionary.items() if elem[0]!=3]
0
Piotr Duda 20 Июл 2010 в 17:24

Чтобы заставить их работать, вы можете сделать это:

# Get the remaining elements
size = len(data_dictionary)
for index in range(4,size):
            assembled_packet.append(data_dictionary[index])
1
thegrinner 20 Июл 2010 в 17:18