У меня есть несколько списков, я должен объединить их, но как я могу определить значение в порядке убывания и поставить его как STD? - PullRequest
0 голосов
/ 28 мая 2018

Отображаются мои списки:

['river: 0.3']
['spread: 0.04']
['idaho: 0.5']

Я хочу сначала объединить их вместе, затем ранжировать по значению в порядке убывания и поместить его в качестве стандартного вывода.Наконец, напечатайте предложение, например, наибольшее значение 0,711, оно напечатает:

"the largest value is idaho"

Вот моя попытка, но я потерпел неудачу, когда хочу оценить его:

u = ['river: 0.3']
v = ['spread: 0.04']
s = ['idaho: 0.5']
mergelist = u + v + s
ranklist = sorted(mergelist, key=lambda x: x[1], reverse=True)
for i in ranklist:
    print(' '.join(list(map(str, i))))
print("the largest value is" + ' ' + ranklist[0])

Желаемоестандартный вывод:

idaho 0.5
river 0.3
spread 0.04
the largest value is idaho

Ответы [ 4 ]

0 голосов
/ 28 мая 2018

Попробуйте добавить имя и число с плавающей запятой в новый словарь, имя в качестве ключа, значение с плавающей запятой в качестве значения, а затем получите ключ с наибольшим значением:

rank = {}
u = ['river: 0.3']
v = ['spread: 0.04']
s = ['idaho: 0.5']
for i in u+v+s:
   rank[i.split(': ')[0]] = float(i.split(': ')[-1])
print("the largest value is {[0]}".format([i for i in rank.keys() if rank[i] == max(rank.values())]))

Выходные данные:

the largest value is idaho
0 голосов
/ 28 мая 2018

В вашем коде есть пара ошибок.

Прежде всего

['river: 0.3']
['spread: 0.04']
['idaho: 0.5']

Нет пар (т.е. не в форме (x, y)).

Вам нужно что-то вроде этого:

u = ['river', 0.3]
v = ['spread', 0.04]
s = ['idaho', 0.5]

, и теперь мы не можем объединить их с помощью операции плюс (+), а скорее

mergelist = [u, v, s]

изатем

ranklist = sorted(mergelist, key=lambda x: x[1], reverse=True)
for i in ranklist:
    print(' '.join(list(map(str, i))))
print("the largest value is" + ' ' + str(ranklist[0][0]))

обратите внимание, что я использовал ranklist [0] [0] вместо ranklist [0], потому что теперь это список списков.

0 голосов
/ 28 мая 2018

Первая проблема состоит в том, что числовые значения все еще находятся внутри строк (которые по какой-то причине находятся внутри списка из одного элемента).Я предлагаю вам разбить строки на ':' и использовать словарь в качестве структуры слияния данных, а не список.

>>> u = ['river: 0.3']
>>> v = ['spread: 0.04']
>>> s = ['idaho: 0.5']
>>> 
>>> d = {}
>>> for item, in (u, v, s):
...     key, value = item.split(':')
...     d[key] = float(value)
... 
>>> d
{'spread': 0.04, 'river': 0.3, 'idaho': 0.5}

Обратите внимание, что item, распаковывает список длиной 1.

Конечно, если вы жестко закодировали u, v и s, вы можете просто набрать d = {'river': 0.3, 'spread': 0.04, 'idaho': 0.5} in.

Теперь у вас есть хороший, чистый словарь для простых операций поиска.

>>> d['river']
0.3

Теперь вы можете сортировать items диктанта по значению в порядке убывания ...

>>> from operator import itemgetter
>>> sorted(d.items(), key=itemgetter(1), reverse=True)
[('idaho', 0.5), ('river', 0.3), ('spread', 0.04)]

... или использовать встроенную функцию max, если вам просто нужнопара (ключ, значение) с максимальным значением.

>>> max(d.items(), key=itemgetter(1))
('idaho', 0.5)
>>>
>>> _, max_value = max(d.items(), key=itemgetter(1))
>>> max_value
0.5
0 голосов
/ 28 мая 2018

Это один подход

u = ['river: 0.3']
v = ['spread: 0.04']
s = ['idaho: 0.5']
mergelist = u + v + s

import operator

d = {}
for i in mergelist:
    val = i.split(":")
    d[val[0].strip()] = float(val[1].strip())

print("the largest value is {}".format(max(d.items(), key=operator.itemgetter(1))[0]))

Вывод:

the largest value is Idaho
  • разбить строку на :
  • Форма dictиз разделенных значений.
  • Используйте оператор, чтобы получить максимальное значение из вашего dict.

По запросу в комментариях

for k, v in sorted(d.items(), key=lambda x: x[1], reverse=True):
    print(k, v)

Вывод:

idaho 0.5
river 0.3
spread 0.04
...