Как я могу расположить список в соответствии с аналогичным пунктом в определенном месте

1

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

Вход:

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']

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

  • 0
    Это список в списке. Если вы используете test [0], вы получаете [[0.52, '1_1man :: Army'], 'stack', 'testing'], если вы используете test [0] [0], вы получаете 0.52
  • 0
    Да, я отредактировал свой вопрос. Я сделал ошибку и обновил ее
Показать ещё 6 комментариев
Теги:
list

2 ответа

3

Вы можете сделать это с помощью 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

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

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]))
  • 1
    Большое вам спасибо, сэр.
  • 0
    Сэр, что делать, если мне нужно загрузить из текстового файла? пример мой текстовый файл выглядит следующим образом [0.52, '1_1man :: Army'], 'stack'] [0.45, '3_3man :: Army'], 'flow'] [0.52, '1_1man :: Army'], 'тестирование '] [0.52,' 2_2man: армия '],' эксперт ']
Показать ещё 8 комментариев
1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню