Как я могу расположить список в соответствии с аналогичным пунктом в определенном месте - PullRequest
0 голосов
/ 27 августа 2018

Я хотел расположить элементы списка «test» для второй части = «1_1man: Army», в которых есть похожие слова, а затем расположить их так, чтобы значения после «1_1man: Army», которые являются значениями для «stack» и"проверка" должна быть рядом друг с другом в новом столбце.

Ввод:

test = [[[0.52, '1_1man::army'], 'stack'], 
    [[0.45, '3_3man::army'], 'flow'], 
    [[0.52, '1_1man::army'], 'testing'], 
    [[0.52, '2_2man:army'], 'expert']]

код:

for x in test:
print(x[0][1])

Ожидаемый результат:

печать (тест)

test = [[[0.52, '1_1man::army'], 'stack', 'testing'], 
        [[0.45, '3_3man::army'], 'flow'], 
        [[0.52, '2_2man:army'], 'expert']]

Может ли кто-нибудь помочь мне, пожалуйста.Если возможно расположить его в порядке возрастания в соответствии с целочисленным значением (0,45,0,52)

Сортировать вывод:

test = [[[0.45, '3_3man::army'], 'flow'],
[[0.52, '1_1man::army'], 'stack', 'testing'], 
[[0.52, '2_2man:army'], 'expert']]

Обновлено:

Как я могу загрузить его, еслиЯ хочу использовать пример, показанный Рахулом ниже?

мой текстовый файл выглядит так

[0.52, '1_1man::army'], 'stack'] 
[0.45, '3_3man::army'], 'flow']
[0.52, '1_1man::army'], 'testing'] 
[0.52, '2_2man:army'], 'expert']

как его загрузить?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вы можете использовать collections.defaultdict для создания словаря списков.Затем используйте понимание списка, чтобы связать ключи со значениями в списке списков.Решение имеет сложность O (n), так как, в отличие от itertools.groupby, оно не требует предварительной сортировки.

test = [[[0.52, '1_1man::army'], 'stack'], 
        [[0.45, '3_3man::army'], 'flow'], 
        [[0.52, '1_1man::army'], 'testing'], 
        [[0.52, '2_2man:army'], 'expert']]

from collections import defaultdict

d = defaultdict(list)

for key, value in test:
    d[tuple(key)].append(value)

res = [[k]+v for *k, v in d.items()]

Результат

print(res)

[[[(0.52, '1_1man::army')], 'stack', 'testing'],
 [[(0.45, '3_3man::army')], 'flow'],
 [[(0.52, '2_2man:army')], 'expert']]
0 голосов
/ 27 августа 2018

Вы можете сделать это с помощью groupby,

In [41]: from itertools import groupby
In [42]: for g,val in groupby(sorted(test,key=lambda x:x[0][1]),key=lambda x:x[0][1]):
    ...:     g_values = list(val)
    ...:     keys = [i[1] for i in g_values]
    ...:     print list([g_values[0][0]] + keys)
    ...:     
    ...:     
[[0.52, '1_1man::army'], 'stack', 'testing']
[[0.52, '2_2man:army'], 'expert']
[[0.45, '3_3man::army'], 'flow']

sorted здесь важно, для groupby оно будет группироваться только с регулировочными элементами.И лямбда-функция, используемая для идентификации группового ключа.

Редактировать 1

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

In [60]: result = []
In [58]: for g,val in groupby(sorted(test,key=lambda x:x[0][1]),key=lambda x:x[0][1]):
    ...:     g_values = list(val)
    ...:     keys = [i[1] for i in g_values]
    ...:     result.append(list([g_values[0][0]] + keys))
    ...:     

In [60]: sorted(result,key=lambda x:x[0][0])
Out[60]: 
[[[0.45, '3_3man::army'], 'flow'],
 [[0.52, '1_1man::army'], 'stack', 'testing'],
 [[0.52, '2_2man:army'], 'expert']]

Изменить 2

Если вы читаете из файла.

In [83]: from ast import literal_eval

In [84]: fp = open('file_name.txt')

In [85]: test = [literal_eval(i) for i in fp.readlines()]

Окончательное решение будет таким:

from ast import literal_eval
fp = open('file_name.txt')
test = [literal_eval(i) for i in fp.readlines()]
result = []
for g,val in groupby(sorted(test,key=lambda x:x[0][1]),key=lambda x:x[0][1]):
    g_values = list(val)
    keys = [i[1] for i in g_values]
    result.append(list([g_values[0][0]] + keys))
print(sorted(result,key=lambda x:x[0][0]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...