Получение максимального значения из словаря - PullRequest
2 голосов
/ 07 февраля 2011

У меня проблема с этим. В моем словаре 10000 строк, и это одна из строк

Пример: A (8) C (4) G (48419) T (2) при распечатке

Я хотел бы получить 'G' в качестве ответа, так как оно имеет наибольшее значение.

В настоящее время я использую Python 2.4, и я понятия не имею, как решить эту проблему, так как я совершенно новый в Python.

Большое спасибо за предоставленную помощь:)

Ответы [ 5 ]

3 голосов
/ 07 февраля 2011

Вот решение, которое

  1. использует регулярное выражение для сканирования всех вхождений заглавной буквы, за которой следует число в скобках
  2. преобразовывает пары строк из регулярного выражения с выражением генератора в кортежи (значение, ключ)
  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"))
1 голос
/ 07 февраля 2011
max(d.itervalues())

Это будет намного быстрее, чем, скажем, d.values ​​(), так как оно использует итерируемое.

1 голос
/ 07 февраля 2011

Попробуйте следующее:

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.
0 голосов
/ 15 марта 2011
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'
0 голосов
/ 07 февраля 2011

Используйте регулярные выражения для разбиения строки. Затем для всех сопоставленных групп необходимо преобразовать сопоставленные строки в числа, получить максимум и найти соответствующую букву.

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
...