首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在某个位置按相似项目排列列表?

如何在某个位置按相似项目排列列表?
EN

Stack Overflow用户
提问于 2018-08-27 16:56:32
回答 2查看 97关注 0票数 1

我想要排列第二部分的“测试”列表项= "1_1man:Army“,它们有相似的单词,然后排列它,使"1_1man:Army”之后的值在新列中相邻。

输入:

代码语言:javascript
运行
复制
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']]

代码:

代码语言:javascript
运行
复制
for x in test:
print(x[0][1])

预期输出:

打印(测试)

代码语言:javascript
运行
复制
test = [[[0.52, '1_1man::army'], 'stack', 'testing'], 
        [[0.45, '3_3man::army'], 'flow'], 
        [[0.52, '2_2man:army'], 'expert']]

有谁能帮我一下吗?如果可能,按照整数值(0.45,0.52)按升序排列

排序输出:

代码语言:javascript
运行
复制
test = [[[0.45, '3_3man::army'], 'flow'],
[[0.52, '1_1man::army'], 'stack', 'testing'], 
[[0.52, '2_2man:army'], 'expert']]

更新:

如果我想使用Rahul在下面展示的例子,我如何加载它?

我的文本文件是这样的

代码语言:javascript
运行
复制
[0.52, '1_1man::army'], 'stack'] 
[0.45, '3_3man::army'], 'flow']
[0.52, '1_1man::army'], 'testing'] 
[0.52, '2_2man:army'], 'expert']

如何加载?

EN

回答 2

Stack Overflow用户

发布于 2018-08-27 17:12:26

你可以用groupby做到这一点,

代码语言:javascript
运行
复制
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,它将只与调整元素组合在一起。以及用于标识分组关键字的lambda函数。

编辑1个

根据你问题中所做的修改。如果需要基于浮点值进行排序。

代码语言:javascript
运行
复制
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

如果您正在从文件中读取。

代码语言:javascript
运行
复制
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()]

最终的解决方案是这样的。

代码语言:javascript
运行
复制
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]))
票数 3
EN

Stack Overflow用户

发布于 2018-08-27 18:59:46

您可以使用collections.defaultdict创建列表字典。然后使用列表理解将关键字与列表列表中的值链接起来。与itertools.groupby不同,该解决方案的复杂度为O(n),因为它不需要事先排序。

代码语言:javascript
运行
复制
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()]

结果

代码语言:javascript
运行
复制
print(res)

[[[(0.52, '1_1man::army')], 'stack', 'testing'],
 [[(0.45, '3_3man::army')], 'flow'],
 [[(0.52, '2_2man:army')], 'expert']]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52035779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档