【问题标题】:How can I create an array/list of dictionaries in python?如何在 python 中创建字典数组/列表?
【发布时间】:2011-01-24 18:15:53
【问题描述】:

我有一本字典如下:

{'A':0,'C':0,'G':0,'T':0}

我想创建一个里面有很多字典的数组,如下:

[{'A':0,'C':0,'G':0,'T':0},{'A':0,'C':0,'G':0,'T':0},{'A':0,'C':0,'G':0,'T':0},...]

这是我的代码:

weightMatrix = []
for k in range(motifWidth):
    weightMatrix[k] = {'A':0,'C':0,'G':0,'T':0}

但它当然不起作用。有人可以给我一个提示吗?谢谢。

【问题讨论】:

标签: python list arrays dictionary


【解决方案1】:

试试这个:

lst = []
##use append to add items to the list.

lst.append({'A':0,'C':0,'G':0,'T':0})
lst.append({'A':1,'C':1,'G':1,'T':1})

##if u need to add n no of items to the list, use range with append:
for i in range(n):
    lst.append({'A':0,'C':0,'G':0,'T':0})

print lst

【讨论】:

    【解决方案2】:

    使用列表构造函数对 user1850980 的回答(关于“如何初始化空字典列表”的问题)的微小变化:

    dictlistGOOD = list( {} for i in xrange(listsize) )
    

    我懊恼地发现,这不起作用:

    dictlistFAIL = [{}] * listsize  # FAIL!
    

    因为它会创建一个对相同空字典的引用列表,因此如果您更新列表中的一个字典,所有其他引用也会更新。

    试试这些更新看看有什么不同:

    dictlistGOOD[0]["key"] = "value"
    dictlistFAIL[0]["key"] = "value"
    

    (我实际上是在寻找 user1850980 对所提问题的回答,所以他/她的回答很有帮助。)

    【讨论】:

      【解决方案3】:

      字典:

      dict = {'a':'a','b':'b','c':'c'}
      

      字典数组

      arr = (dict,dict,dict)
      arr
      ({'a': 'a', 'c': 'c', 'b': 'b'}, {'a': 'a', 'c': 'c', 'b': 'b'}, {'a': 'a', 'c': 'c', 'b': 'b'})
      

      【讨论】:

      • 首先,您不应该使用dict 作为变量名,其次,您正在创建一个包含 same 字典三次的元组(不是列表) ,因此您对其中一个所做的每一项更改都会影响其他所有更改。
      【解决方案4】:

      我就是这样做的,而且效果很好:

      dictlist = [dict() for x in range(n)]
      

      它为您提供了一个包含 n 个空字典的列表。

      【讨论】:

      • 这不是他问的......而且两年前就已经回答了
      • 是的,他应该问一个不同的问题。
      • 有史以来最好的解决方案。适用于 Python3。
      【解决方案5】:
      weightMatrix = [{'A':0,'C':0,'G':0,'T':0} for k in range(motifWidth)]
      

      【讨论】:

      • +1 因为列表理解是要走的路(比.append 调用的循环更易读、更优雅、更简洁),即使原始答案中的k in motifWidth 是一个明显的、可怕的错误(我已经编辑了答案来解决这个问题!-)。
      • @devon:不,他们不是。请注意,例如,如果您运行weightMatrix[0]['A'] += 1,那么weightMatrix[1] 的字典值中仍然全为0。列表解析与 [{'A':0,'C':0,'G':0,'T':0}] * motifWidth 的工作方式不同,后者创建同一个 dict 对象的多个副本。
      【解决方案6】:

      我假设motifWidth 包含一个整数。

      在 Python 中,列表不会改变大小,除非你告诉它们。因此,当您尝试更改不存在的元素时,Python 会引发异常。我相信你想要:

      weightMatrix = []
      for k in range(motifWidth):
          weightMatrix.append({'A':0,'C':0,'G':0,'T':0})
      

      对于它的价值,在将来提出问题时,如果您包含显示您遇到的错误的堆栈跟踪而不是仅仅说“它不工作”,将会有所帮助。这将帮助我们直接找出问题的原因,而不是试图从您的代码中找出问题。

      希望有帮助!

      【讨论】:

      • +1 我会添加提示“当心matrix = [{'A':0}, ...] * motifWidth,因为这会创建一个引用同一对象的项目列表。
      【解决方案7】:

      使用

      weightMatrix = []
      for k in range(motifWidth):
          weightMatrix.append({'A':0,'C':0,'G':0,'T':0})
      

      【讨论】:

        猜你喜欢
        • 2019-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-22
        • 1970-01-01
        • 2022-11-18
        • 2020-03-07
        • 2023-02-07
        相关资源
        最近更新 更多