0

是否可以做这样的事情:

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]

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

4

3 回答 3

2

我不清楚你到底想做什么。您正在按整数索引字典。整数可以用作字典的键就好了,但看起来列表在你的情况下更有意义。字典和列表之间的一个重要区别是字典没有排序。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')]

但是如上所述,即使在这个例子中它们的顺序是正确的,你也不能依赖字典的顺序,它会随着时间的推移而改变。

于 2012-10-06T16:28:39.297 回答
1

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

不过,您可以自己滚动它,例如

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

或(感谢@DSM)

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

这些略有不同,如果结果f()是缺失12作为键,第一个将默认为 assigning None,第二个将 raise KeyErrormap(f().__getitem__, ...)应该等价于itemgetter,但可能会稍微慢一些。

于 2012-10-06T16:22:57.163 回答
1

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

x,y = f().values()[0:2]
于 2012-10-06T16:25:24.220 回答