从字典中获取最大值

2 投票
5 回答
2299 浏览
提问于 2025-04-16 11:22

我遇到了一个问题。我在字典里有10,000行数据,这里是其中一行的例子:

比如:A (8) C (4) G (48419) T (2),打印出来是这样的。

我想要得到'G'这个答案,因为它的值是最高的。

我现在使用的是Python 2.4,但我对这个还不太了解,所以不知道该怎么解决。

非常感谢任何提供的帮助 :)

5 个回答

1

试试下面这个:

st = "A (8) C (4) G (48419) T (2)" # your start string
a=st.split(")")
b=[x.replace("(","").strip() for x in a if x!=""]
c=[x.split(" ") for x in b]
d=[(int(x[1]),x[0]) for x in c]
max(d) # this is your result.
1
max(d.itervalues())

这个方法会比比如说 d.values() 快很多,因为它使用了一个可迭代的对象。

3

这里有一个解决方案,它的步骤如下:

  1. 使用正则表达式来查找所有大写字母后面跟着数字的情况,这些数字被括号包围。
  2. 通过生成器表达式把正则表达式找到的字符串对转换成(value, key)的元组。
  3. 返回那些元组中值最大的那个元组的key。

我还添加了一个主函数,这样这个脚本就可以作为命令行工具使用,读取一个文件中的所有行,并把每行中值最大的key写入到一个输出文件里。这个程序使用了迭代器,所以无论输入文件有多大,它都能高效地使用内存。

import re
KEYVAL = re.compile(r"([A-Z])\s*\((\d+)\)")

def max_item(row):
    return max((int(v),k) for k,v in KEYVAL.findall(row))[1]

def max_item_lines(fh):
    for row in fh:
        yield "%s\n" % max_item(row)

def process_file(infilename, outfilename):
    infile = open(infilename)
    max_items = max_item_lines(infile)
    outfile = open(outfilename, "w")
    outfile.writelines(max_items)
    outfile.close()

if __name__ == '__main__':
    import sys
    infilename, outfilename = sys.argv[1:]
    process_file(infilename, outfilename)

对于单行数据,你可以这样调用:

>>> max_item("A (8) C (4) G (48419) T (2)")
'G'

而要处理整个文件的话,可以这样:

>>> process_file("inputfile.txt", "outputfile.txt")

如果你想要一个实际的Python列表,包含每一行的最大值,可以使用:

>>> map(max_item, open("inputfile.txt"))

撰写回答