【问题标题】:Sorting a hash table and printing key and value at the same time对哈希表进行排序并同时打印键和值
【发布时间】:2014-06-02 10:07:12
【问题描述】:

我在 python 中编写了一个程序,其中我使用哈希表从文件中读取数据,然后在文件的最后一列中添加与文件第二列中的值相对应的数据。例如,对于第 2 列中具有相同值的所有条目,将添加相应的最后一列值。

现在我已经成功实现了上述内容。现在我想根据最后一列的值对表格进行降序排序,并打印这些值和相应的第二列(键)值。我无法弄清楚如何做到这一点。有人可以帮忙吗?

pmt txt 文件格式为

0.418705 2 3 1985 20 0
0.420657 4 5 119 3849 5 
0.430000 2 3 1985 20 500

等等……

因此,例如,对于第 2 列中的数字 2,我添加了与第 2 列中所有数字“2”相对应的最后一列的所有数据。因此,对于第 2 列中的下一组数字 4、5 等,此过程将继续进行。

我正在使用 python 3

import math

source_ip = {}
f = open("pmt.txt","r",1)
lines = f.readlines()

for line in lines:
    s_ip = line.split()[1]
    bit_rate = int(line.split()[-1]) + 40
    if s_ip in source_ip.keys():
       source_ip[s_ip] = source_ip[s_ip] + bit_rate
       print (source_ip[s_ip])
    else:
       source_ip[s_ip] = bit_rate

f.close()

for k in source_ip.keys():
    print(str(k)+": "+str(source_ip[k]))
    print ("-----------")

【问题讨论】:

  • 请提供pmt.txt内容的简要示例。可能有比您实施的方法更好的方法来做到这一点,但是如果没有看到示例输入,我们只能做这么多。另请说明您使用的是 Python 2 还是 Python 3。
  • pmt txt 文件的格式为 0.418705 2 3 1985 20 0 0.420657 4 5 119 3849 5 0.430000 2 3 1985 20 500 等等......因此,例如,对于第 2 列中的数字 2 ,我在第二列中添加了与所有数字“2”相对应的最后一列的所有数据。因此,对于第 2 列中的下一组数字 4、5 等,此过程将继续。我正在使用 python 3
  • 请您将其编辑到您的问题中,格式正确吗? (等宽和灰色背景每行 4 个前导空格。)

标签: python sorting hashtable


【解决方案1】:

这样的事情怎么样?

#!/usr/local/cpython-3.4/bin/python

import collections

source_ip = collections.defaultdict(int)
with open("pmt.txt","r",1) as file_:
    for line in file_:
        fields = line.split()
        s_ip = fields[1]
        bit_rate = int(fields[-1]) + 40
        source_ip[s_ip] += bit_rate
        print (source_ip[s_ip])

for key, value in sorted(source_ip.items()):
    print('{}: {}'.format(key, value))
    print ("-----------")

【讨论】:

  • 但是排序呢??
  • 我添加了排序并消除了大吸气。
  • 现在对于已排序的列,对于前 3 个条目,我需要取对应的下一列值(值)并将其除以该列中的总值(所有值的总和)。我尝试使用删除命令,以便删除每个最大条目,然后再次找到整个事物的最大值(以获得第二个最大值),然后是第三个最大值。但删除不适用于哈希表
【解决方案2】:

听起来您想使用带有key 参数的sorted 函数,该参数从键/值元组中获取值:

sorted_items = sorted(source_ip.items(), key=lambda x: x[1])

您也可以使用 operator 模块中的 itemgetter,而不是 lambda 函数:

import operator
sorted_items = sorted(source_ip.items(), key=operator.itemgetter(1))

【讨论】:

  • 我认为应该是按键排序(x[0])。
  • 需要根据第2列对应的加法后最后一列的值进行排序,即需要对source_ip[s_ip]进行降序排序,并打印排序后的值和对应的值键。
  • @user3547134:如果您想要降序而不是升序,除了key 函数之外,还可以将reverse=True 参数添加到sorted
  • 谁能告诉我如何将这些值写入文件而不是终端,因为在终端上,我无法看到所有值,因为里面有很多东西txt文件
  • @user3547134:尝试对file 仅关键字参数使用print
猜你喜欢
  • 2019-03-17
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
相关资源
最近更新 更多