#python #list #dictionary
Вопрос:
Это для курса CS50 задание под названием ДНК на python, я несколько дней боролся, исследуя и пытаясь понять, как заставить работать заключительный раздел. Я новичок.
Я загрузил базу данных людей и их ДНК в память в список диктаторов.
Затем я зачитал тестовый образец ДНК в память в виде строки, а затем искал и фильтровал его в поисках последовательностей ДНК.
Итак, теперь у меня есть диктант под названием str_test И список диктантов, называемых данными, содержащими ДНК каждого, мне нужно как-то сравнить str_test с данными, чтобы увидеть, соответствует ли кто-нибудь и вернуть имена людей.
Как я уже сказал, я борюсь с этим, я разработал, как зацикливать и адресовать значения в данных — список dict, а также str_test для определения результатов, но я не могу смешать их вместе.
Я приношу извинения за количество областей #d, но они предназначены для меня для тестирования, буду признателен за любые рекомендации. Последние 5-7 строк я пытаюсь пролистать, но это неправильно, должен быть простой лучший способ, спасибо
import csv import sys def main(): # Ensure correct usage if len(sys.argv) != 3: sys.exit("Usage: python dna.py data.csv sequence.txt") data = [] with open(sys.argv[1], "r") as csvfile: #open the file in the command line argument reader = csv.DictReader(csvfile) for row in reader: #lets go loopy row = (row) data.append(row) #print(row) #print(data) #print(reader.fieldnames) #print(data) with open(sys.argv[2], "r") as file: #open the sample file in the command line argument sequence = file.read() #read it to array/memory print(reader.fieldnames) #test print print(sequence) #test print #two files now opened #sequence is the test DNA sequence #we want to loop through the STR's here and take the first and then loop that through the sequence str_test = {} # a dictionary for the counts for i in range (1, (len(reader.fieldnames ))): #read the header field names ie STR, count them starting after name field sample = (reader.fieldnames[i]) print(reader.fieldnames) print(sample) #DNA type to compare to test string called SEQUENCE str_test[sample] = 0 for j in range(len(sequence)): # this will loop through the long string to be tested for the STR DNA (sample) step = 0 max_count = 0 while sequence[j step:j step len(sample)] == sample: step = step len(sample) max_count = 1 print(max_count) j = j step #test = (str_test.get(sample)) if max_count gt; (str_test.get(sample)): #get the existing value of the sample and compare str_test[sample] = max_count #if count is larger then update field if not continue print(str_test) #test print to see whats in the dictionary print(str_test.values()) #print(key.values()) #print(data) #print(len(data)) #print(type(str_test)) for d in data: #data is a list of dictionaries - so this is cycle through the list [1:] to start at first for values in (str_test): #start to loop through the dictionary for the test string dna results for key in d: #this is cycling through the dictionary thats part of the list of dictionaries strvalue = str_test.get(values) datavalue = int(d.get(values) main()
информация, содержащаяся в str_test, выглядит следующим образом —
{'AGATC': 4, 'TTTTTTCT': 0, 'AATG': 1, 'TCTAG': 0, 'GATA': 1, 'TATC': 5, 'GAAA': 1, 'TCTG': 0}
информация в списке диктантов, которую я должен найти, соответствует приведенному выше str_test, выглядит следующим образом:
[ { 'name': 'Albus', 'AGATC': '15', 'TTTTTTCT': '49', 'AATG': '38', 'TCTAG': '5', 'GATA': '14', 'TATC': '44', 'GAAA': '14', 'TCTG': '12' }, { 'name': 'Cedric', 'AGATC': '31', 'TTTTTTCT': '21', 'AATG': '41', 'TCTAG': '28', 'GATA': '30', 'TATC': '9', 'GAAA': '36', 'TCTG': '44' }, { 'name': 'Draco', 'AGATC': '9', 'TTTTTTCT': '13', 'AATG': '8', 'TCTAG': '26', 'GATA': '15', 'TATC': '25', 'GAAA': '41', 'TCTG': '39' }, { 'name': 'Fred', 'AGATC': '37', 'TTTTTTCT': '40', 'AATG': '10', 'TCTAG': '6', 'GATA': '5', 'TATC': '10', 'GAAA': '28', 'TCTG': '8' }, { 'name': 'Ginny', 'AGATC': '37', 'TTTTTTCT': '47', 'AATG': '10', 'TCTAG': '23', 'GATA': '5', 'TATC': '48', 'GAAA': '28', 'TCTG': '23' }, { 'name': 'Hagrid', 'AGATC': '25', 'TTTTTTCT': '38', 'AATG': '45', ... # this is a short extract
Комментарии:
1. Всего пара коротких заметок.
sys.exit
не печатает его результаты. Он принимает целое число, которое возвращается в качестве кода возврата. Используйтеrow = (row)
абсолютно ничего не делает. Тебе это все равно не нужно.2. Итак, вы знаете, как сделать петлю.
for row in data:
/if sequence in row['dna']:
кажется, это то, что вам нужно. Вы не показали нам данные, поэтому мы не знаем, что это за столбцы.3. {‘AGATC’: 4, ‘TTTTTTCT’: 0, ‘AATG’: 1, ‘TCTAG’: 0, ‘GATA’: 1, ‘TATC’: 5, ‘GAAA’: 1, ‘TCTG’: 0} — строка, которую я отфильтровал и должен соответствовать, listofdict [{‘имя’: ‘Альбус’, ‘AGATC’: ’15’, ‘TTTTTTCT’: ’49’, ‘AATG’: ’38’, ‘TCTAG’: ‘5’, ‘GATA’: ’14’, ‘TATC’: ’44’, ‘GAAA’: ’14’, ‘TCTG’: ’12’}, {‘имя’: ‘Седрик’, ‘AGATC’: ’31’, ‘TTTTTCT’: ’21’, ‘AATG’: ’41’, ‘TCTAG’: ’28’, ‘GATA’: ’30’, ‘TATC’: ‘9’, ‘GAAA’: ’36’, ‘TCTG и т.д., Это небольшой отрывок, но даст вам представление, спасибо за любой совет, C был логичным, Python смутил меня, обращаясь к местоположениям, спасибо
4. Я просто смотрю на последовательность if в строке, я думаю, что мне нужно…. если str_test в строке[‘данные’] для команды, все еще пытаясь разобраться в этом синтаксисе , в моем файле данных есть ключ dict «имя», где тестовый файл не содержит только прямые ключи:значения, как это влияет на последовательность if в строке?, спасибо Тим
5. Учитывая ваши данные, ваше описание проблемы вообще не имеет смысла. Каждое имя в вашем списке содержит все последовательности в вашем списке поиска. Я могу показать вам ответ, но в проблеме должно быть нечто большее, чем то, чем вы поделились.
Ответ №1:
Это делает то, о чем вы просили, но я на 100% уверен, что то, о чем вы спросили, не является проблемой, которую вас просили решить. Как я уже упоминал, каждое имя в вашем списке имен содержит все последовательности в вашем списке поиска. Это довольно легко обработать, потому что ключи в вашей базе данных являются точными последовательностями, поэтому вам даже не нужно выполнять поиск по строкам.
searches = {'AGATC': 4, 'TTTTTTCT': 0, 'AATG': 1, 'TCTAG': 0, 'GATA': 1, 'TATC': 5, 'GAAA': 1, 'TCTG': 0} database = [ {'name': 'Albus', 'AGATC': '15', 'TTTTTTCT': '49', 'AATG': '38', 'TCTAG': '5', 'GATA': '14', 'TATC': '44', 'GAAA': '14', 'TCTG': '12'}, {'name': 'Cedric', 'AGATC': '31', 'TTTTTTCT': '21', 'AATG': '41', 'TCTAG': '28', 'GATA': '30', 'TATC': '9', 'GAAA': '36', 'TCTG': '44'}, {'name': 'Draco', 'AGATC': '9', 'TTTTTTCT': '13', 'AATG': '8', 'TCTAG': '26', 'GATA': '15', 'TATC': '25', 'GAAA': '41', 'TCTG': '39'}, {'name': 'Fred', 'AGATC': '37', 'TTTTTTCT': '40', 'AATG': '10', 'TCTAG': '6', 'GATA': '5', 'TATC': '10', 'GAAA': '28', 'TCTG': '8'}, {'name': 'Ginny', 'AGATC': '37', 'TTTTTTCT': '47', 'AATG': '10', 'TCTAG': '23', 'GATA': '5', 'TATC': '48', 'GAAA': '28', 'TCTG': '23'}, {'name': 'Hagrid', 'AGATC': '25', 'TTTTTTCT': '38', 'AATG': '45'}] for row in database: for search in searches.keys(): if search in row: print( row['name'], 'matches', search )
Выход:
Albus matches AGATC Albus matches TTTTTTCT Albus matches AATG Albus matches TCTAG Albus matches GATA Albus matches TATC Albus matches GAAA Albus matches TCTG Cedric matches AGATC Cedric matches TTTTTTCT Cedric matches AATG Cedric matches TCTAG Cedric matches GATA Cedric matches TATC Cedric matches GAAA Cedric matches TCTG Draco matches AGATC Draco matches TTTTTTCT Draco matches AATG Draco matches TCTAG Draco matches GATA Draco matches TATC Draco matches GAAA Draco matches TCTG Fred matches AGATC Fred matches TTTTTTCT Fred matches AATG Fred matches TCTAG Fred matches GATA Fred matches TATC Fred matches GAAA Fred matches TCTG Ginny matches AGATC Ginny matches TTTTTTCT Ginny matches AATG Ginny matches TCTAG Ginny matches GATA Ginny matches TATC Ginny matches GAAA Ginny matches TCTG Hagrid matches AGATC Hagrid matches TTTTTTCT Hagrid matches AATG
Комментарии:
1. отсортировано, спасибо за совет, вы заставили меня немного по-другому взглянуть на структуры данных и на то, как я их искал, спасибо