【问题标题】:Python - uniquifying(!) dictionary keysPython - 唯一(!)字典键
【发布时间】:2010-01-23 10:51:16
【问题描述】:

我有来自机器的数据(通过 pexpect),我使用正则表达式将其解析成这样的字典

for line in stream:
    if '/' in line:
        # some matching etc which results in getting the
        # machine name, an interface and the data for that interface
        key=str(hostname)+":"+r.groups()[0][0:2]+r.groups()[2]
        dict[key]=str(line[3])

一切正常,当我读回来时,我得到了很多这样的台词

machine1:fe0 <data>  

&lt;data&gt; 是一个字符串或整数

我现在意识到接口可以存在多个数据,并且似乎在这种情况下,我每次遇到它时都会覆盖键的值。我想要的是以一种突出显示该界面存在多个信息的事实的方式使密钥独一无二。例如。如果 fe0 有 3 个实例或 fe1 有 4 个

machine1:fe0:3 <data> <data> <data>
machine1:fe1:4 <data> <data> <data> <data>

为此,我不介意单个实例后面是否有 1 来告诉我。
希望这很清楚,有人可以指出我正确的方向 - 非常感谢

【问题讨论】:

  • 你想要的数据结构是一个multimap,下面的defaultdict(list)是通常的实现。

标签: python dictionary


【解决方案1】:

您可以为每个键创建一个列表,保存该键的所有值:

d = collections.defaultdict(list)
for line in stream:
    if '/' in line:
        #.....
        key =  str(hostname)+":"+r.groups()[0][0:2]+r.groups()[2]
        value = str(line[3])
        d[key].append(value)

编辑:如果您想要完全按照问题中指定的键/值,您可以执行以下操作:

d2 = {}
for key,values in d.iteritems():
    d2['%s:%d' % (key, len(values)] = ' '.join(str(v) for v in values)

我在这里使用了' '.join() 将值连接到一个字符串中 - 从你的问题中并不清楚这是否是你想要的。

我不建议这样做,因为这会使访问单个值变得更加困难。

【讨论】:

  • 我认为这比我做的更干净,但是它改变了存储在字典中的东西的类型,这可能需要程序的其他部分进行更改以适应它。
  • 我添加了一种方法,您可以完全按照您的要求进行操作,但我不确定您希望如何存储这些值。
  • 好的,只是想了解如何将其放入我的脚本中。数据稍后会进入 excel,所以我一直用制表符分隔数据
  • 您好 Interjay 作为一个不常使用的 Python 用户,我在我的代码中使用此代码时遇到了很大的困难。你能帮忙吗?
  • 我会在第二个循环中使用d.popitem(),因为我倾向于过度担心内存消耗。
【解决方案2】:
for (lineno, line) in enumerate(stream):
    if '/' in line:
        # some matching etc which results in getting the
        # machine name, an interface and the data for that interface
        key=str(hostname)+":"+r.groups()[0][0:2]+r.groups()[2]
        dict[key + ":" + lineno]=str(line[3])

您不会以这种方式顺利增加它,但每个字典键将是唯一的,并且与每个主机名+接口对关联的数字将会增加。您可以通过将最后一行更改为 dict[key + ":" + ('%06d' % (lineno,))=str(line[3]) 来使键在词法上可排序

【讨论】:

  • 这行得通,虽然它没有给出实例的计数,但它确实给出了多行,一旦在 excel 中排序就很容易发现(必须转到其他行)。我正在尝试让其他人也尝试这样做
猜你喜欢
  • 2011-07-24
  • 2023-04-06
  • 2019-02-08
  • 1970-01-01
  • 2012-06-20
  • 2013-04-12
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多