2017-10-28 55 views
0

我習慣使用Matlab及其強大的冒號操作符。 似乎在Python中有等價物,但它包含字典時並不完全。 這是我的例子:冒號:運算符在列表中

data = [ 
    {'key1' : 'value1', 'key2' : 'value2'}, 
    {'key1' : 'value3', 'key2' : 'value4'}, 
    {'key1' : 'value1', 'key2' : 'value5'} 
] 

data[0:2]作品,並返回[{'key1': 'value1', 'key2': 'value2'}, {'key1': 'value3', 'key2': 'value4'}](但是我會本能地使用0:1有此相同的結果)

data[0:2]['key2']不和返回list indices must be integers, not str

我應該得出結論::只能用於不包含字典的列表,或者我打字它錯了嗎?

感謝,

+0

你真的應該學習如何使用範圍說明符。這對Python來說非常重要,您應該在使用Python的第一個小時內瞭解它。對於列表'x',指定'x [a:b]'返回一個'x'的片段,其第一個索引是'a',最後一個索引是'b-1'(含)。但它仍然是一個列表。在你的情況下,該列表包含兩個字母。如果你想訪問一個dict元素,你必須首先從列表中選擇一個元素(或者從片斷中)。例如。 'data [0:2] [1] ['key2']',或'data [1] ['key2']' –

+0

您是否混淆了':'的兩種不同用法?當指定一個字典與它在切片'[0:2]'中的使用沒有任何關係時,它就可以使用。任何*序列*都可以被分割,包括列表,元組和字符串,而不管元素引用的對象的類。 – cdarke

回答

3

如果我的結論是:只能在不包含字典列表中使用,或者我打字錯了?

這不是一個正確的結論。 :可以與任何列表一起使用。

問題是data[0:2]是一個列表。 如果你想在data[0:2]元素的'key2'值的列表,那麼你需要編寫的列表理解:

>>> [v['key2'] for v in data[0:2]] 
... ['value2', 'value4'] 

如果你喜歡使用,而不是一個列表理解的操作,就可以使用以下內容:

>>> from operator import itemgetter 
>>> map(itemgetter('key2'), data[0:2]) 
... ['value2', 'value4'] 
相關問題