【发布时间】:2019-04-18 14:08:40
【问题描述】:
我一直为此烦恼。我有两个列表
lista = ["a", "b", "c", "d"]
listb = [80, 90, 70, 60]
我想这样映射它
“a”的值为 80
“b”的值为 90
“c”的值为 70 并且
“d”的值为 60
然后,我想打印具有第二大值的字符串,即“a”
有什么办法吗?
【问题讨论】:
-
我们刚刚完成了你的一项家庭作业吗?
我一直为此烦恼。我有两个列表
lista = ["a", "b", "c", "d"]
listb = [80, 90, 70, 60]
我想这样映射它
“a”的值为 80
“b”的值为 90
“c”的值为 70 并且
“d”的值为 60
然后,我想打印具有第二大值的字符串,即“a”
有什么办法吗?
【问题讨论】:
要确定第二高的值,您需要至少跟踪迭代中的前两个值。所以再次使用heapq,类似于your previous problem。
from heapq import nlargest
lista = ["a", "b", "c", "d"]
listb = [80, 90, 70, 60]
n = 2
idx, _ = zip(*nlargest(n, enumerate(listb), key=lambda x: x[1])) # (1, 0)
key = lista[idx[-1]] # 'a'
只有对于较大的 n 值,您才应该考虑全排序,sorted 可能表现更好。
【讨论】:
可以使用argsort'ing listb 来完成,它返回已排序项目的索引。然后从索引第二高的lista 中选择。 argsort 在numpy 中可用。
import numpy
second_largest_str = lista[numpy.argsort(listb)[-2]]
print(second_largest_str)
【讨论】:
解决此问题的一种方法是创建一个字典,其中字符列表是 Key,整数列表是 Values
可能有很多方法可以做到这一点,这只是一种!
Zip 获取两个列表并从中创建一个字典,第一个参数是键,第二个参数是值
a = ["A", "B", "C"]
b = [1, 2, 3]
dict_1 = dict(zip(a,b))
print(dict_1)
>>> {'A': 1, 'B': 2, 'C': 3}
然后您可以使用它按值从小到大对字典进行排序
x = sorted((k,v) for v,k in dict_1.items())
然后要访问倒数第二个,您可以从右侧访问字典(负索引)
print(x[-2])
>>> (3, 'C')
【讨论】:
您可以为此使用pandas:
import pandas as pd
In [2210]: lista = ["a", "b", "c", "d"]
In [2211]: listb = [80, 90, 70, 60]
In [2213]: df = pd.DataFrame(lista)
In [2214]: df['listb'] = listb
In [2215]: df
Out[2215]:
0 listb
0 a 80
1 b 90
2 c 70
3 d 60
然后找到第二高的,如下所示:
In [2228]: df.nlargest(2, 'listb').tail(1).values.tolist()
Out[2228]: [['a', 80]]
【讨论】:
这是一个足够简单的版本
d = {}
l = ["a", "b", "c", "d"]
j = [80, 90, 70, 60]
for i in range(len(l)):
d[str(l[i])] = j[i]
d = sorted(d.items(), key=lambda x: x[1], reverse=True)
print(d[1])
【讨论】:
sorted() 函数接受一个可选的键参数:
lista = ["a", "b", "c", "d"]
listb = [80, 90, 70, 60]
pairs = zip(lista, listb)
sorted_tuples = sorted(pairs, key=(lambda pair : pair[1]), reverse=True)
str_with_second_highest_nr = sorted_tuples[1][0]
您可以将其压缩到一对 lista 和 listb 中,并在每个元组中的第二项之后将它们排序,并使用 lambda 函数作为关键参数。 然后只需选择第二对的第一个位置
>>> print(sorted_tuples)
[('b', 90), ('a', 80), ('c', 70), ('d', 60)]
>>> print(str_with_second_highest_nr)
a
【讨论】: