是否可以编写一个以特定格式返回多个值的函数?

Amo*_*s P 2 python dictionary return dictionary-comprehension

我正在编写一个返回两个值的函数,这两个值将形成字典的键值对。该函数将用于创建具有字典理解的字典。但是,使用字典理解,需要以“键:值”的格式提供值对。为了实现这一点,我必须调用该函数两次。一次用于键,一次用于值。例如,

sample_list = [['John', '24', 'M', 'English'], 
               ['Jeanne', '21', 'F', 'French'],
               ['Yuhanna', '22', 'M', 'Arabic']]

def key_value_creator(sample_list):
   key = sample_list[0]
   value = {'age': sample_list[1],
            'gender': sample_list[2], 
            'lang': sample_list[3]}

   return key, value

dictionary = {key_value_creator(item)[0]: \
              key_value_creator(item)[1] for item in sample_list}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,该函数被调用两次以生成可以在一次运行中生成的值。有没有办法以可理解的格式返回值?如果可能的话,该函数只需调用一次,如下所示:

dictionary = {key_value_creator(item) for item in sample_list}
Run Code Online (Sandbox Code Playgroud)

据我所知,返回多个值的其他方法是以字典或列表的形式返回它们,

return {'key': key, 'value': value}
Run Code Online (Sandbox Code Playgroud)
return [key, value]
Run Code Online (Sandbox Code Playgroud)

但无论哪种方式,要访问它们,我们都必须调用该函数两次。

dictionary = {key_value_creator(item)['key']: \
              key_value_creator(item)['value'] for item in sample_list}
Run Code Online (Sandbox Code Playgroud)
dictionary = {key_value_creator(item)[0]: \
              key_value_creator(item)[1] for item in sample_list}
Run Code Online (Sandbox Code Playgroud)

有没有办法格式化这些值,以便我们可以将它们以字典理解语句所需的格式发送到它?

编辑:预期输出:

{ 'John': {'age': '24', 'gender': 'M', 'lang': 'English'}, 
'Jeanne': {'age': '21', 'gender': 'F', 'lang': 'French'}, 
'Yuhanna': {'age': '22', 'gender': 'M', 'lang': 'Arabic'}}
Run Code Online (Sandbox Code Playgroud)

tob*_*s_k 5

只需使用内置函数,期望函数返回dict一系列对,并从中创建一个:(key, value)key_value_creatordict

>>> dict(map(key_value_creator, sample_list))
{'Jeanne': {'age': '21', 'gender': 'F', 'lang': 'French'},
 'John': {'age': '24', 'gender': 'M', 'lang': 'English'},
 'Yuhanna': {'age': '22', 'gender': 'M', 'lang': 'Arabic'}}
Run Code Online (Sandbox Code Playgroud)

也可以使用生成器表达式而不是map

>>> dict(key_value_creator(item) for item in sample_list)
Run Code Online (Sandbox Code Playgroud)

或者使用带有嵌套生成器表达式和元组解包的字典理解:

>>> {k: v for k, v in (key_value_creator(item) for item in sample_list)}
Run Code Online (Sandbox Code Playgroud)

或者没有你的key_value_creator函数,只使用嵌套字典理解:

>>> {n: {"age": a, "gender": g, "lang": l} for n, a, g, l in sample_list}
Run Code Online (Sandbox Code Playgroud)