2010-07-20 17 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

你是说'如果payload_index <> 3'效率低下?你测过它了吗? – Gabe 2010-07-20 17:14:25

+0

字典不一定按顺序排列 - 你的意思是关键字是3的项目吗? – Mark 2010-07-20 17:15:04

+0

'我的问题是我需要总是跳过第三个元素'。请注意,这些书籍没有订单! – ChristopheD 2010-07-20 17:16:20

回答

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

附: <>早已弃用。

+3

+1。在事实发生几个月后,这个小小的“if”语句可能会更多地传达程序员的意图,而不是两个奇怪的“for”循环,而这些循环恰好忽略了一个元素。 – Faisal 2010-07-20 17:20:55

+0

爱流行的想法。谢谢! – 2010-07-20 17:35:39

+0

我喜欢'<>'不等于'。请注意,它不是**弃用** - 它是[过时](http://docs.python.org/reference/expressions.html)! – 2010-07-20 22:06:26

1

为了使那些循环工作,你可以这样做:

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

我能想到的最好的办法是:如果你想跳过firts

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

从你的答案不是很明显三个项目或只是第三个项目。 如果前者的情况下,你是不知道,那你的钥匙始终是1,2,3,你可以做这样的事情:

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

我的问题是我需要时刻跳过第三个元素。我想,如果我能做到的,但是这将是低效的:

这更是低效的:

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

谢谢。这不是一个类型名称,它在此上下文之外调用的值。 – 2010-07-20 19:35:03

相关问题