2017-10-28 115 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']