Как отобразить список строк и список целых чисел и вывести строку, которая имеет второе наибольшее значение - PullRequest
0 голосов
/ 15 ноября 2018

У меня были проблемы с этим. У меня есть два списка

lista = ["a", "b", "c", "d"]

listb = [80, 90, 70, 60]

Я хочу отобразить это так

«а» имеет значение 80

«b» имеет значение 90

«с» имеет значение 70 и

«d» имеет значение 60

Затем я хочу напечатать строку со вторым по величине значением, которое является "a"

Есть ли способ сделать это?

Ответы [ 6 ]

0 голосов
/ 15 ноября 2018

Функция 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 и отсортировать их после второго элемента в каждом кортеже с лямбда-функцией в качестве ключевого аргумента. Затем просто выберите первую позицию второй пары

>>> print(sorted_tuples)
[('b', 90), ('a', 80), ('c', 70), ('d', 60)]

>>> print(str_with_second_highest_nr)
a
0 голосов
/ 15 ноября 2018

Вот достаточно простая версия для того же

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])
0 голосов
/ 15 ноября 2018

Вы можете использовать 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

Затем найдите 2-е место, как показано ниже:

In [2228]: df.nlargest(2, 'listb').tail(1).values.tolist()
Out[2228]: [['a', 80]]
0 голосов
/ 15 ноября 2018

Одним из способов решения этой проблемы является создание словаря, в котором список символов представляет собой Ключ , а список целых чисел представляет собой Значения

Вероятно, существует множество способов сделать это, только один!

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') 
0 голосов
/ 15 ноября 2018

Это можно сделать с помощью argsort 'ing listb, который возвращает индексы отсортированных элементов. Затем выберите из lista со вторым по величине индексом. argsort доступно в numpy.

import numpy

second_largest_str = lista[numpy.argsort(listb)[-2]]
print(second_largest_str)
0 голосов
/ 15 ноября 2018

Чтобы определить второе по величине значение, вам нужно отследить, как минимум, два верхних значения в вашей итерации. Поэтому снова используйте heapq, аналогично вашей предыдущей проблеме .

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 может работать лучше.

...