通过每个项目的两个第一值来优化列表列表中的频率

时间:2017-10-13 22:25:52

标签: python list duplicates frequency

我对编程完全不熟悉(不到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方式来做到这一点?

1 个答案:

答案 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} })但我上面发布的解决方案线性扩展。因此它应该能够有效地处理更大的数据集。