我对编程完全不熟悉(不到2个月 - 自学成才)我正在研究一个项目,它需要每个内部的前两个索引列表的频率列表。
这是我的清单:
x = [[' block',3],[' street',2],[' lamp',1],['街',2], [' industrial',3],[' park',2],[' park',3],[' industrial',3 ] [' block',3],[' street',2],[' lamp',1],[' street',2 ],[' industrial', 3],[' park',2]]
所以每个内部列表的第一个值是TITLE,第二个值是CONVENTIONAL VALUE。
重要的是,你可以看到其中一些被重复(重复)。
我想要一个像这样的列表输出列表:
p = [[' block',3,2],[' street',2,4],[' lamp',1,2] ,[' industrial', 3,3],[' park',2,2],[' park',3,1]]
使用第三个值作为该内部列表的频率,在外部列表x中。
所以这是我的非pythonic(可能是枯燥的)方法:
<head>
<link rel="import" href="topmenu.html">
</head>
<body>
<h1>First</h1>
<script>
var link = document.querySelector('link[rel="import"]');
var content = link.import;
// Grab DOM from warning.html's document.
var el = content.querySelector('body');
document.body.appendChild(el.cloneNode(true));
</script>
</body>
但是对于我的项目,因为这个函数后跟其他函数,与它们相比,这个函数的运行时间很长,特别是对于大量的输入数据集。
因为我缺乏知识,所以我无法优化我编写的代码。
所以我问是否有更快更多的pythonic方式来做到这一点?
答案 0 :(得分:1)
是的,请使用字典。我假设该订单很重要,所以我会使用OrderedDict
,但如果订单无关紧要,您可以考虑Counter
个对象:
>>> 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]]
刚刚注意到你在使用Python 2(如果你可以帮助它,你应该真正使用Python 3),在这种情况下,因为你使用的是Python 2,你应该使用counter.iteritems()
而不是{{1 }}
类似于:
counter.items()
注意,你的第一个for循环是平方的缩放,对于那个while循环,我不想考虑它,我想也许是二次的,但可能更糟(因为你{{1} })但我上面发布的解决方案线性扩展。因此它应该能够有效地处理更大的数据集。