从python中的2个列表构建一个布尔字典

时间:2014-01-06 17:05:50

标签: python list dictionary boolean

在比较2个列表中的元素时,我正在尝试创建一个值为'True'或'False'的字典。这可能有点基础,但我是编码的新手,我不明白为什么它总是指定'真'值,即使我看到它不是真的:

 letters = [A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]

 randomData = []

 f = open('randomData.txt', 'r')
 for line in f:
      randomData.append(line.rstrip().split()[0])
 f.close()

'randomData.txt'文件如下所示:

 A'\t'0003'\t'0025'\t'chr1
 B'\t'0011'\t'0021'\t'chr7
 D'\t'0043'\t'0068'\t'chr3
 F'\t'0101'\t'0119'\t'chr7

randomData列表现在应该如下所示:

 ['A','B','D','F']

我试过了:

 sameLetters = {}

 i=0
 while i < len(letters):
     if letters[i] and randomData:
         #append to dictionary
         sameLetters[letters[i]] = 'True'
     else:
         #append to dictionary
         sameLetters[letters[i]] = 'False'
     i=i+1

 print sameLetters

我期待的是:

 {'A': 'True', 'B': 'True', 'C': 'False', 'D': 'True', 'E': 'False', 'F': 'True', 'G': 'False', etc

相反,字典中的所有值都是“True”。有谁能看到这个问题?或者给出任何指示或解释?任何帮助都会很棒,非常感谢。

3 个答案:

答案 0 :(得分:4)

也许你的意思是if letters[i] in randomData

答案 1 :(得分:1)

我想你想做点什么:

sameLetters = {l: l in randomData for l in letters}

您当前的尝试不起作用,因为您检查

if letters[i] and randomData:
            # ^ should be in

并且Python将非空字符串(letters[i])和非空列表(randomData)解释为True。

另请注意,letters已在Python中提供:

from string import ascii_uppercase

这是一个字符串,但您可以像列表一样迭代并索引字符串,in仍然有效。

答案 2 :(得分:0)

好像你只关心随机数据中出现哪个字母,为什么不使用set

from string import ascii_uppercase

randomData = ['A', 'B', 'D', 'F', 'A']

appeared = set(ascii_uppercase).intersection(set(randomData))
print appeared

以后你可以这样说:

char = 'z'
if char in appeared:
    print 'yes'
else:
    print 'no'

修改

那怎么样:)

from string import ascii_uppercase

randomData = ['A', 'B', 'D', 'F', 'A']

appeared = set(ascii_uppercase).intersection(set(randomData))

d = dict(zip(ascii_uppercase, (False,) * 26))

for key in appeared:
    d[key] = True

print d