python语法功能

时间:2012-10-06 16:18:40

标签: python

可以做这样的事情:

def f():
  d={}
  d[1]='qwe'
  d[2]='rty'
  return d

a,b=f()[1:2]

不是a,b=f()[1],f()[2] 而不是

t=f()
a,b=t[1],t[2]

我不会避免额外的行和调用函数一次。

3 个答案:

答案 0 :(得分:2)

我不清楚你想要做什么完全。您是按整数索引字典。整数可以很好地用作字典的键,但看起来列表在你的情况下更有意义。字典和列表之间的一个重要区别是dicts不是有序的。在您的示例中,d[1]d[2]不一定位于第一和第二位。因此,如果您依赖订单,标准词典无论如何都不会起作用(OrderedDict会)。

(您的数据结构由函数f()返回的事实在这里没有任何区别,所以为了更好的可读性,我会忽略它)

如果你有

lst = ['qwe', 'rty']

你可以简单地做

a, b = lst

lst[0]分配给a,将lst[1]分配给b。列表也可以切片:

long_lst = range(1000)
a, b = long_lst[500:502]

如果你实际上想要使用字典,你可以像这样访问它的组件:

>>> d = {'a': 'AAA', 'b': 'BBB'}
>>> d.keys()
['a', 'b']
>>> d.values()
['AAA', 'BBB']
>>> d.items()
[('a', 'AAA'), ('b', 'BBB')]

但如上所述,即使它们恰好在此示例中的顺序正确,您也不能依赖字典的顺序,它会随着时间的推移而改变。

答案 1 :(得分:1)

没有;字典索引不支持切片,因为它通常在字典键中没有任何意义。

你可以自己滚动它,比如

a, b = map(f().get, [1, 2])

或(感谢@DSM)

a, b = operator.itemgetter(1, 2)(f())

这些略有不同,如果f()的结果缺少12作为键,则第一个将默认为分配None而第二个将提升KeyErrormap(f().__getitem__, ...)应该等同于itemgetter,但可能稍慢一些。

答案 2 :(得分:1)

是的,只需使用方法dict.values()

x,y = f().values()[0:2]