【问题标题】:deleting dictionaries with negative values in python在python中删除具有负值的字典
【发布时间】:2021-05-17 15:55:02
【问题描述】:

我有一个函数 (makeDict),它以这种形式创建字典:

def makeDict(gcRange, min_val):
     maxC = gcRange[1]-min_val
     probC = random.choice(np.arange(min_val, maxC, 2))
     gc = [gcRange[0]-probC, gcRange[1]-probC]
     probG = random.choice(np.arange(gc[0], gc[1], 2))
     at = 100 - probC - probG
     probA = at/2
     probT = at/2
     return({"A":probA, "T":probT, "G":probG, "C":probC})

Output from the function
{'A': 30.0, 'T': 30.0, 'G': -4, 'C': 44}
{'A': 25.0, 'T': 25.0, 'G': 25, 'C': 25}
{'A': 29.0, 'T': 20.0, 'G': 31, 'C': 40}
.....

我想应用该功能并删除所有键为负值的字典

Final Output:
{'A': 28.0, 'T': 29.0, 'G': 20, 'C': 49}
{'A': 29.0, 'T': 30.0, 'G': 20, 'C': 50}

我想要一个循环生成 10 个字典,同时排除具有负值的字典

d=[]
for i in range(0, 10):
     new= ""
     while True:
          new=makeDict([40,60],10)
          for v in new:
               if new[v] < 0:
                    del new
                    break
     d.append(new)

但是,循环似乎卡住了,在 pycharm 中我得到“代码无法访问” 有什么建议吗?

【问题讨论】:

  • 你的break 让你脱离for 循环,但不是无限的while 循环
  • 如果我们能看到 makeDict 函数本身会更容易提供帮助。我看到的一个大问题是,当使用for v in new 时,v 被分配给new 的项目。然后您不必使用new[v] 来获取这些项目。你应该使用更像for v in new: if v &lt; 0: ...的东西。
  • 我添加了函数
  • 是的,我使用的是 if v

标签: python dictionary for-loop


【解决方案1】:

你犯了一个逻辑错误。您检测具有负值的 dics 的代码是正确的,但它只能退出 while 循环当且仅当生成的 dic 包含负值。一旦创建了没有负值的 dic,程序就会卡住。

你应该通过以下方式重构你的代码:

d=[]
for i in range(0, 10):
    check = 0
    new=makeDict([40,60],10)

    for v in new:
        if new[v] < 0:
            check = 1
            break
            
    if check == 0: d.append(new)

希望对您有所帮助!

【讨论】:

  • for i in range(0, 10): new= "" while True: new=makeDict([40,60],10) for v in new: if new[v]
  • 如果我添加两个休息似乎也可以工作
  • 但它并没有解决问题,所以可能你的方法是正确的,谢谢
【解决方案2】:

一些备注:

  • 避免分配不适当类型的值,例如new= ""
  • 避免while True 循环
  • 我猜你想遍历字典的值 - for v in new.values(): - 更多信息 here

我不得不做出一些假设,比如 10 表示字典的数量,但我猜你想要的代码看起来像这样:

d = []
for i in range(10):
    new = makeDict([40, 60], 10)
    skip = False
    for v in new.values():
        if v < 0:
            skip = True
            break
    if skip:
        continue
    d.append(new)

【讨论】:

    猜你喜欢
    • 2018-12-04
    • 2022-11-25
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    相关资源
    最近更新 更多