Я хотел упорядочить элементы списка "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']
как его загрузить?
Вы можете сделать это с помощью 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]))
Вы можете использовать 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']]