繁体   English   中英

多个条件来比较python中两个字典的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM