【问题标题】:Assigning a listeof alphabet array to a list of number array将 listeof 字母数组分配给数字数组列表
【发布时间】:2013-02-05 10:36:08
【问题描述】:

我是新手,我的问题很简单。我有两个数组列表,如下所示:

Grade = ["A","A-","B+","B","B-","C+","C","C-","D","F"]
GPA = [4,3.75,3.25,3,2.75,2.25,2,1.75,1,0]

如何从列表中分配 A = 4、A- = 3.75 等等。

请帮忙!!

【问题讨论】:

  • 使用 eval python 命令。
  • 例如A- 和 B+ 不是有效的变量名。
  • @Michel Keijzers 从不使用 eval。编辑localsglobals,随便什么,但不是评估。
  • @BasicWolf:就此而言,您不应该修改locals()——更改它不会产生您认为的效果。

标签: arrays list python-3.x


【解决方案1】:

只需使用zip函数:

grade_gpa = zip(Grade, GPA)
for pair in grade_gpa:
    print(pair)
>>>
('A', 4)
('A-', 3.75)
('B+', 3.25)
('B', 3)
('B-', 2.75)
('C+', 2.25)
('C', 2)
('C-', 1.75)
('D', 1)
('F', 0)

此外,您可以从 zip 对象中构造字典:

grade_gpa_dict = dict(grade_gpa)
print(grade_gpa_dict['A'])
>>> 4

【讨论】:

  • 第一部分还可以。但是当我运行:grade_gpa_dict = dict(grade_gpa) print(grade_gpa_dict['A']) 它给了我关键错误!
  • @user2042721:zip 对象 grade_gpa 在 Python 3 中只能迭代一次,所以如果你在打印循环之后用它创建一个字典,就什么都没有了。只需使用grade_gpa_dict = dict(zip(Grade, GPA))
【解决方案2】:

使用内置的 map/reduce:

import functools

a = map(lambda x,y : {x:y}, Grade, GPA)
b = functools.reduce(lambda x,y: dict(x.items() + y.items()), a)

b["A"] => 4

【讨论】:

  • 这比dict(zip(Grade, GPA))好多少?
  • 确实我没有在问题标签中看到“3.x”,我的错。它并不比你的答案“更好”,只是不同^^顺便说一句,我已经用他们推送reduce的包的名称编辑了我的答案。
  • 确实,你的答案不一样,我想说的是不是看起来过于复杂?例如,在map() 中,您为每对创建一个dict 对象。 x.items() + y.items() 在 Py3 中也不起作用,因为 dict.items() 是一个迭代器,(应该将其转换为列表)。总体而言 - 您必须编写 3 行代码(包括 import)而不是单一而简单的代码。底线是您的代码运行良好,但它既没有性能优势,也没有可读性优势。查看Zen of Python 的前三个语句:)
猜你喜欢
  • 2015-12-06
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多