0

我正在尝试分析和理解一个实现简单 map-reduce 想法的 python 程序。我在理解一些代码时有些困难。

Person = namedtuple('Person', ['name', 'gender', 'age', 'height'])

persons = [
    Person('mary', 'fem', 21, 60.2),
    Person('suzy', 'fem', 32, 70.1),
    Person('jane', 'fem', 27, 58.1),
    Person('jill', 'fem', 24, 69.1),
    Person('bess', 'fem', 43, 66.6),
    Person('john', 'mal', 25, 70.8),
    Person('jack', 'mal', 40, 59.1),
    Person('mike', 'mal', 42, 60.3),
    Person('zack', 'mal', 45, 63.7),
    Person('alma', 'fem', 34, 67.0),
    Person('bill', 'mal', 20, 62.1),
]

def height_by_gender_and_agegroup(p):
    key = p.gender, p.age //10
    val = p.height
    return key, val

该函数height_by_gender_and_agegroup(p)似乎为每个返回两个值p。好像又回来了

<key,val> where key is p.gender and val is p.height
<key,val> where key is p.age and val is p.height

我一直在用 C 和 C++ 编程,但对 python 还是很陌生。我的问题是如何在 Python 中按值返回多个对。即假设这就是这段代码正在做的事情。如果是,我如何处理返回值?

下面的答案似乎传达了这样一个事实,即在 python 中返回一个键值对类似于返回一个具有两个成员的结构。我理解那部分。

 key = p.gender, p.age //10

我的问题在上面一行。Key 似乎有两个值p.genderp.age。如果是这种情况,则需要为 P 的每个值返回两组。这是<key,value>如何工作的?

4

3 回答 3

2

它返回的是两个项目的元组。(它基本上相当于在 C 中返回一个具有两个字段的结构)。您可以像这样解压缩返回的元组:

key, val = height_by_gender_and_agegroup(person)

以这种方式考虑它可能会有所帮助:

def height_by_gender_and_agegroup(p):
    key = p.gender, p.age //10
    val = p.height
    return (key, val)  # note the optional parentheses to denote a tuple

ret = height_by_gender_and_agegroup(person)
key = ret[0]
val = ret[1]  # "key, val =" is just a shortcut for this

由于您案例中的密钥包含两个值,因此您可以进一步解包:

(gender, age), val = height_by_gender_and_agegroup(person)

或者,如果您愿意:

key, val = height_by_gender_and_agegroup(person)
gender, age = key
于 2013-02-11T18:40:32.107 回答
2

该函数实际上是返回一个元组

>>> def f(): return 1, 2
... 
>>> type(f())
<type 'tuple'>

像任何元组一样,您可以通过下标或按顺序分配成员来访问其值:

>>> first, second = f()
>>> second
2
于 2013-02-11T18:40:51.047 回答
2

你可以说:

 k,v = height_by_gender_and_agegroup(p)
于 2013-02-11T18:41:13.340 回答