簡體   English   中英

從字典中獲取最大值

[英]Getting the maximum value from dictionary

我正面臨這個問題。 我的字典中有10,000行,這是其中之一

示例:打印時為A(8)C(4)G(48419)T(2)

我想以'G'作為答案,因為它的價值最高。

我目前正在使用Python 2.4,但我不知道如何解決此問題,因為我是Python的新手。

非常感謝您提供的任何幫助:)

這是一個解決方案

  1. 使用正則表達式來掃描所有出現的大寫字母,后跟方括號中的數字
  2. 將帶有生成器表達式的正則表達式中的字符串對轉換為(value,key)元組
  3. 從具有最高值的元組返回鍵

我還添加了一個主要功能,以便該腳本可用作命令行工具,以從一個文件讀取所有行,並將每行具有最高值的鍵寫入輸出文件。 該程序使用迭代器,因此無論輸入文件有多大,它都可以提高內存效率。

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"))
max(d.itervalues())

這將比說d.values()快得多,因為它使用的是可迭代的。

請嘗試以下操作:

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.

使用正則表達式分隔行。 然后,對於所有匹配的組,您必須將匹配的字符串轉換為數字,獲得最大值,然后找出相應的字母。

import re
r = re.compile('A \((\d+)\) C \((\d+)\) G \((\d+)\) T \((\d+)\)')
for line in my_file:
  m = r.match(line)
  if not m:
    continue # or complain about invalid line
  value, n = max((int(value), n) for (n, value) in enumerate(m.groups()))
  print "ACGT"[n], value
row = "A (8) C (4) G (48419) T (2)"

lst = row.replace("(",'').replace(")",'').split() # ['A', '8', 'C', '4', 'G', '48419', 'T', '2']

dd = dict(zip(lst[0::2],map(int,lst[1::2]))) # {'A': 8, 'C': 4, 'T': 2, 'G': 48419} 

max(map(lambda k:[dd[k],k], dd))[1] # 'G'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM