2011-02-07 1 views
2

У меня проблема с этим. У меня есть 10000 строк в моем словаре, и это одна из строкПолучение максимального значения из словаря

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

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

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

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

+0

Дайте нам две или три строки из вашего словаря и ожидаемый результат. – eumiro

+0

Дубликат http://stackoverflow.com/questions/268272/getting-key-with-maximum-value-in-dictionary – bluish

+0

Почему вы используете выпуск с 2005 года? – delnan

ответ

3

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

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

+1 для более сжатой и более общей версии моего ответа. –

+0

Есть ли другие способы, в которых мне не нужно записывать его в выходной файл, вместо этого он отображается напрямую? Спасибо – Vincent

+0

@Vincent: Последний пример должен покрыть это. – shang

0

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

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 
+0

Извините, это Python2.6. Вы можете сделать это в Python2.4, но вам, вероятно, понадобятся квадратные скобки внутри max, т. Е. Max ([...]). –

+0

В Python2.6 следующее работает и возвращает '9':' max (i для i в xrange (10)) ' – eumiro

+0

2.4 старая и не такая блестящая, и ей не хватает большей части новой удивительности Python. Но у него есть генераторные выражения. – delnan

1
max(d.itervalues()) 

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

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