首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按每个项目的两个第一个值优化列表中的频率

按每个项目的两个第一个值优化列表中的频率
EN

Stack Overflow用户
提问于 2017-10-13 22:25:52
回答 1查看 29关注 0票数 2

我对编程完全陌生(不到2个月-自学),我正在做一个项目,它需要在每个内部列表的前两个索引中列出列表的频率。

这是我的清单:

X=[“街区”、3、“街道”、2、“灯”、1、“街道”、2、“工业”、3、“公园”、2、“公园”、3、“工业”、3、“区块”、3、“街道”、2、“灯”、1、“街道”、2、“工业”、3、“公园”、2]

因此,每个内部列表中的第一个值是一个标题,第二个值是一个常规值。

重要的是,正如你所看到的,其中一些是重复的。

我想要一个如下列表的输出列表:

P=[“街区”,3,2,“街道”,2,4,“灯”,1,2,“工业”,3,3,“公园”,2,2,“公园”,3,1]

以第三个值作为内部列表的频率,在外部列表x中。

下面是我的非节奏式(也许是枯燥的)方法:

代码语言:javascript
运行
复制
x = [['block', 3], ['street', 2], ['lamp',1], ['street', 2], ['industrial', 3], ['park', 2], ['park', 3], ['industrial', 3], ['block', 3], ['street', 2], ['lamp',1], ['street', 2], ['industrial', 3], ['park', 2]]
p = []

for a in x:
    p.append(a ),  a.append( x.count(a))

print p # checkpoint

i= 0
while i < len(p):
    for j in range(len(p)):
        if i == j:
            print i, ' = ', j
            break
        else:
            if p[i][:2] == p[j][:2]:
                print p[i][:2], '==', p[j][:2]
                p.pop(i)
                i = 0
                j=0
                break
    i = i+1

print p # the list of lists I'm desired

但是对于我的项目,因为这个函数后面跟着其他函数,与它们相比,这个函数具有较高的运行时间,特别是具有大量的输入数据集。

因为我缺乏知识,所以我无法优化我编写的代码。

所以我想问一下,有没有更快、更多的琵琶方法来做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-13 22:44:52

是的,用字典。我假设顺序很重要,所以我将使用OrderedDict,但是如果顺序不重要,您可以考虑使用Counter对象:

代码语言:javascript
运行
复制
>>> from collections import OrderedDict
>>> counter = OrderedDict()
>>> for a, b in x:
...     t = (a, b)
...     counter[t] = counter.get(t, 0) + 1
...
>>> final = [[a, b, v] for (a,b),v in counter.items()]
>>> final
[['block', 3, 2], ['street', 2, 4], ['lamp', 1, 2], ['industrial', 3, 3], ['park', 2, 2], ['park', 3, 1]]

刚刚注意到您使用的是Python2(如果您可以帮助它,您应该真正使用Python3),在这种情况下,既然您使用的是Python2,那么您应该使用counter.iteritems()而不是counter.items()

所以,就像:

代码语言:javascript
运行
复制
>>> final = [[a, b, count] for (a, b), count in counter.iteritems()]
>>> final
[['block', 3, 2], ['street', 2, 4], ['lamp', 1, 2], ['industrial', 3, 3], ['park', 2, 2], ['park', 3, 1]]

请注意,您的第一个for -循环是二次缩放,至于那个even循环,我不想考虑它,我也认为它可能是二次型的,但可能更糟(因为您是.pop(i)),但是我在上面发布的解决方案是线性的。因此,它应该能够有效地处理更大的数据集。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46738806

复制
相关文章

相似问题

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