【发布时间】:2021-02-12 12:31:03
【问题描述】:
我正在处理这个告诉我们匹配人 DNA 的 CS50 问题集
这是我几乎完成的代码:
import re, csv, sys
def main(argv):
# Open csv file
csv_file = open(sys.argv[1], 'r')
people = csv.reader(csv_file)
nucleotide = next(people)[1:]
# Open dna sequences file
txt_file = open(sys.argv[2], 'r')
dna_file = txt_file.read()
str_repeat = {}
str_list = find_STRrepeats(str_repeat, nucleotide, dna_file)
match_dna(people, str_list)
def find_STRrepeats(str_list, nucleotide, dna):
for STR in nucleotide:
groups = re.findall(rf'(?:{STR})+', dna)
if len(groups) == 0:
str_list[STR] = 0
else:
total = max(len(i)/len(STR) for i in groups)
str_list[STR] = int(total)
return str_list
def match_dna(people, str_list):
for row in people:
# Get people name in people csv
person = row[0]
# Get all dna value of each people
data = row[1:]
# If all value in dict equal with all value in data, print the person
if str_list.values() == data:
print(person)
sys.exit(0)
print("No match")
if __name__ == "__main__":
main(sys.argv[1:])
所以,我坚持使用 match_dna 功能。我对如何比较字典中的值:str_list 与列表中的值:people 感到困惑。
str_list = {'AGATC': 4, 'AATG': 1, 'TATC': 5}
data = ['4', '1', '5']
我的代码有什么需要改变的吗?或者可能是比较这两种不同结构的简单方法?谢谢。
【问题讨论】:
-
您可以使用
==来比较str_list和data,就像您已经在做的那样。无论如何,您应该确保两个列表中字段的顺序相同,即确保您没有将AGATC值与TATC值进行比较。 -
Python 支持列表的结构相等性。但是,数据成员的类型和 str_list 的值类型是不同的。另外,在顺序上不能依赖
str_list.values()的返回,所以最好在比较之前对两个列表(data和str_list.values())进行排序。 -
我猜 CSV 文件按给定顺序存储值。我会为
str_list使用OrderedDict,以确保我以相同的顺序将值存储在字典中。然后你可以安全地进行str_list.values() == data比较。 -
data=row[1:],评论说“获取每个人的所有 dna 值”根据您的流程是正确的。 -
@rturrado 它不起作用,它总是打印不匹配。我在哪里把
OrderedDict放在我的代码中?
标签: python dictionary cs50