【问题标题】:building a boolean dictionary from 2 lists in python从python中的2个列表构建一个布尔字典
【发布时间】:2014-01-24 04:03:23
【问题描述】:

在比较 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 和False,为什么还要使用“True”和“False”?
  • 如果您的行确实包含A'\t'0003'\t'0025'\t'chr1,那么您的randomData 列表将改为["A'", "B'", "C'"],例如一个字母和一个引号字符。
  • 好吧,因为 randomData 和 letters[i] 都不是 null,所以都返回 true。
  • 忘记了这篇文章中“字母”周围的“”标记,但它们出现在我的脚本中

标签: python list dictionary boolean


【解决方案1】:

您似乎只关心随机数据中出现哪个字母,那么为什么不使用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

【讨论】:

  • 这些字母只是代表我的实际问题中更复杂的数据。不过还是谢谢
【解决方案2】:

我认为你想做这样的事情:

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 仍然可以工作。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 谢谢,这在算法上对我来说更有意义,但是它返回所有错误
    • 啊我现在明白了,是的,这是可行的,txt 文件格式有问题!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2020-09-18
    • 2015-09-25
    相关资源
    最近更新 更多