Как получить список ([a, 2], [a, 1], [a, 3]) с наибольшим номером ([a, 3]) - PullRequest
2 голосов
/ 21 мая 2019

У меня есть

list=[[a,2],[a,1],[a,3],[b,5],[b,7],[b,6],[c,20],[c,23],[c,30]].

Как получить список наибольшего числа для каждой буквы?И этот список добавляет его в другой список, содержащий наибольшее число для каждой буквы?

Я пытался использовать следующий код, но я новичок в программировании на python, и я не очень много знаю о структурах данных или программировании.

for letter in range(len(final)):
    array1=[]
    array2=[]
    highestvalue=0
    if final[letter][0] == final[letter+1][0]:
        if final[letter][2] < final[letter+1][2]:
            highestvalue=final[letter+1][2]
            array1.append(final[letter][0])
            array1.append(highestvalue)
            array2.append(array1)

Есть ли способ вывести [[a, 3], [b, 7], [c, 30]] из списка?

[EDIT] Собственно, мой списокявляется [[a, abc, 2], [a, def, 1], [a, ghi, 3], [b, jkl, 5], [b, lmn, 7], [b, opq, 6],[c, rst, 20], [c, vwx, 23], [c, yzz, 30]].

Я ожидаю, что создам список, в котором будут храниться переменные [[a, ghi, 3], [Ь, LMN, 7], [с, yzz, 30]].Как я могу создать список со вторым элементом, вместе с буквой и максимальным значением?

Ответы [ 8 ]

2 голосов
/ 21 мая 2019

Так как вы помечаете pandas

pd.DataFrame(l).groupby(0).max().reset_index().values.tolist()
Out[535]: [['a', 3], ['b', 7], ['c', 30]]
2 голосов
/ 21 мая 2019

Вы можете использовать itertools.groupby, чтобы сгруппировать подсписки по буквам и искать максимум в каждой группе:

from operator import itemgetter as g
from itertools import groupby

[max(v, key=g(1)) for k, v in groupby(l, g(0))]
# [['a', 3], ['b', 7], ['c', 30]]
1 голос
/ 21 мая 2019
>>> foo = [['a', 2],['a', 1],['a', 3],
           ['b', 5],['b', 7],['b', 6],
           ['c', 20],['c', 23],['c', 30]]
>>> print({key:value for key, value in sorted(foo)})
{'a': 3, 'b': 7, 'c': 30}
0 голосов
/ 21 мая 2019

Возможно, вы захотите сохранить ваш временный максимум в словаре.Таким образом, вы все равно сможете решить ее со сложностью O(n).Посмотрите на этот быстрый пример:

mylist = [['a','abc',2],['a','def',1],['a','ghi',3],['b','jkl',5],['b','lmn',7],['b','opq',6],['c','rst',20],['c','vwx',23],['c','yzz',30]]

myres = []
mymax = {}

for l in mylist:
    # corresponds to 'a', 'b', 'c', ...
    k = l[0]

    # if your identifier is not already stored
    # or the last value of your array is greater than the one that is already stored
    if not k in mymax or l[-1] > mymax[k][-1]:
        # apply a new maximum
        # *after first iteration it holds -> {'a': ['a','abc',2]}
        mymax[k] = l

# is used to convert back to a list, you may as well skip it if not needed
for _, v in mymax.items():
    myres.append(v)

# prints [['a', 'ghi', 3], ['b', 'lmn', 7], ['c', 'yzz', 30]]
print(myres)

Надеюсь, это поможет!

0 голосов
/ 21 мая 2019

Раствор панд:

pd.DataFrame(l).sort_values([0, 2]).drop_duplicates(subset=[0], keep='last').values.tolist()

Out[23]: [['a', 'ghi', 3], ['b', 'lmn', 7], ['c', 'yzz', 30]]
0 голосов
/ 21 мая 2019

Прежде всего, разделите ваш список на отдельные списки, по одному на каждую букву.Затем создайте список вторых элементов и возьмите max этого.

Другая возможность - создать dict с ключом на букву;значение каждого элемента - это максимальное значение, которое вы видели для этой буквы.

Можете ли вы взять его там?Если нет, я рекомендую поработать над логикой с кем-то локальным, так как Stack Overflow не является учебным сайтом.

0 голосов
/ 21 мая 2019

Вам следует рассмотреть возможность использования места для хранения (словаря) наибольшего значения, встречающегося для каждой буквы.

Затем просмотрите список и сравните имеющееся у вас значение с новым значением для буквы.

list=[[a,2],[a,1],[a,3],[b,5],[b,7],[b,6],[c,20],[c,23],[c,30]]
storing_maximum={}
for x,y in list:
    if x in storing_maximum:
        storing_maximum[x] = max(storing_maximum[x],y)
    else:
        storing_maximum[x] = y
0 голосов
/ 21 мая 2019

Вы можете решить это с помощью простых генераторов Python:

lst=[['a',2],['a',1],['a',3],['b',5],['b',7],['b',6],['c',20],['c',23],['c',30]]
[max(filter(lambda x: x[0] == elem, lst), key=lambda x: x[1]) for elem in set([e[0] for e in lst])]

вернет вам:

[['c', 30], ['b', 7], ['a', 3]]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...