[英]Compare two dictionaries with list of values which satisfies multiple conditions
[英]Multiple conditions to compare values of two dictionaries in python
我有以下两个字典:
fastaDict1 = {'seq1': 'NNNACACGT', 'seq2': 'NNNACACGT'}
fastaDict2 = {'seq1': 'NNNGCACGT'}
我想做的是在fastaDict1中选择一个键,检查该键是否在fastaDict2中,如果该键存在,那么我想遍历fastaDict1的键值中的每个字符,并检查该字符是否与对应的字符匹配在fastaDict2中一个。 也就是说,如果相同的字符在两个字符串中的位置相同。
我写了以下代码:
for keys in fastaDict1.keys():
print keys
for base in range(0, len(fastaDict1[keys])):
if keys in fastaDict2 and fastaDict1[keys][base] != 'N' and fastaDict1[keys][base] == fastaDict2[keys][base]:
print fastaDict1[keys][base] + '\t' + fastaDict2[keys][base] + '\t' + str(base)
else:
print 'Bases do not match' + '\t' + str(base)
但是我得到以下输出:
seq2
Bases do not match 0
Bases do not match 1
Bases do not match 2
Bases do not match 3
Bases do not match 4
Bases do not match 5
Bases do not match 6
Bases do not match 7
Bases do not match 8
seq1
Bases do not match 0
Bases do not match 1
Bases do not match 2
A A 3
C C 4
A A 5
C C 6
G G 7
T T 8
我期望得到的是:
seq1
Bases do not match 0
Bases do not match 1
Bases do not match 2
Bases do not match 3
C C 4
A A 5
C C 6
G G 7
T T 8
我认为我对条件句的逻辑有疑问,我无法弄清楚,任何帮助将不胜感激,谢谢!
您的条件有点错误,根据您的要求,如果键不在fastaDict2中,则不想迭代值;如果是这种情况,则需要移动条件- if keys in fastaDict2:
内部for循环。
范例-
for keys in fastaDict1.keys():
print keys
if keys in fastaDict2:
for base in range(0, len(fastaDict1[keys])):
if fastaDict1[keys][base] != 'N' and fastaDict1[keys][base] == fastaDict2[keys][base]:
print fastaDict1[keys][base] + '\t' + fastaDict2[keys][base] + '\t' + str(base)
else:
print 'Bases do not match' + '\t' + str(base)
示例/演示-
>>> fastaDict1 = {'seq1': 'NNNACACGT', 'seq2': 'NNNACACGT'}
>>> fastaDict2 = {'seq1': 'NNNGCACGT'}
>>> for keys in fastaDict1.keys():
... print(keys)
... if keys in fastaDict2:
... for base in range(0, len(fastaDict1[keys])):
... if fastaDict1[keys][base] != 'N' and fastaDict1[keys][base] == fastaDict2[keys][base]:
... print(fastaDict1[keys][base] + '\t' + fastaDict2[keys][base] + '\t' + str(base))
... else:
... print('Bases do not match' + '\t' + str(base))
...
seq2
seq1
Bases do not match 0
Bases do not match 1
Bases do not match 2
Bases do not match 3
C C 4
A A 5
C C 6
G G 7
T T 8
如果您很好奇,我认为这段代码会更简单
fastaDict1 = {'seq1': 'NNNACACGT', 'seq2': 'NNNACACGT'}
fastaDict2 = {'seq1': 'NNNGCACGT'}
for key in set(fastaDict1.keys()).intersection(fastaDict2.keys()):
print(key)
for i, s in enumerate(fastaDict1[key]):
if s!='N' and s==fastaDict2[key][i]:
print('{}\t{}\t{}'.format(s,s,i))
else:
print('Bases do not match\t{}'.format(i))
生产:
seq1
Bases do not match 0
Bases do not match 1
Bases do not match 2
Bases do not match 3
C C 4
A A 5
C C 6
G G 7
T T 8
如果您的“问题”是seq2行的打印,那是由于您在输入键之后进行了检查,以及dict2没有该键。 因此,像这样移动if:
for keys in fastaDict1.keys():
print keys
if fastaDict2.has_key(keys):
for base in range(0, len(fastaDict1[keys])):
if fastaDict1[keys][base] != 'N' and fastaDict1[keys][base] == fastaDict2[keys][base]:
print fastaDict1[keys][base] + '\t' + fastaDict2[keys][base] + '\t' + str(base)
else:
print 'Bases do not match' + '\t' + str(base)
您的打印将是:
seq2
seq1
Bases do not match 0
Bases do not match 1
Bases do not match 2
Bases do not match 3
C C 4
A A 5
C C 6
G G 7
T T 8
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.