【问题标题】:How to remove large numbers of dictionary entries in python如何在python中删除大量字典条目
【发布时间】:2014-02-26 02:19:25
【问题描述】:

我在python中有一个大字典(https://docs.google.com/document/d/1aNuwIJGRMQA2iSwdT2iliG9Q4Zu2bELNMrQVacEcSdc/edit?usp=sharing),我想删除所有具有某些特征的条目。例如,我想删除元组中第二项等于的所有条目为真,但第三个不等于块。我试图用正则表达式来做这个,但我似乎无法让它工作。

edit:我的基本想法是做这样的事情。

regex="Regular Expression"

for entry in d:
    if len(re.findall(regex,str(entry)))!=0:
        del d[entry]
print(d)

【问题讨论】:

  • 迭代不起作用吗?
  • 你看过filter吗?
  • 当你说“它不工作”时,你到底是什么意思?它是抛出错误,还是只是没有产生预期的结果?在我看来,一个问题是您在删除字典时正在迭代字典。您可以通过将for entry in d: 更改为for entry in d.keys(): 来解决此问题,如此答案中所述:stackoverflow.com/a/5385075/391161
  • 一定要找熊猫。您可以标记这些列,您的查询将类似于g[(not g.happy) & (g.action != 'block')]

标签: python regex dictionary


【解决方案1】:

如果您的字典实际上是在 Python 中,我认为正则表达式不是这里的方法。

这是您的数据示例:

g = {
(0, False, None, 0, False, None):(False,False,True),
(0, True, fire, 0, True, fire):(1/1,1/1,1/1),
(0, True, fire, 0, True, block):(1/1,1/1,1/1),
(0, True, fire, 0, True, reload):(1/1,1/1,1/1),
(0, True, fire, 0, False, fire):(1/1,1/1,1/1),
(0, True, fire, 0, False, block):(1/1,1/1,1/1),
(0, True, fire, 0, False, reload):(1/1,1/1,1/1),
(0, True, fire, 1, True, fire):(1/1,1/1,1/1),
(0, True, fire, 1, True, block):(1/1,1/1,1/1),
(0, True, block, 2, False, reload):(1/1,1/1,1/1),
(0, True, block, 3, True, fire):(1/1,1/1,1/1),
(0, True, block, 3, True, block):(1/1,1/1,1/1),
(0, True, block, 3, True, reload):(1/1,1/1,1/1),
(6, False, reload, 6, True, reload):(1/1,1/1,1/1),
(6, False, reload, 6, False, fire):(1/1,1/1,1/1),
(6, False, reload, 6, False, block):(1/1,1/1,1/1),
(6, False, reload, 6, False, reload):(1/1,1/1,1/1),
}

所以我会使用以下内容,因为现在列表推导和生成器语句实际上已经取代了 Python 中的 map 和 filter,并且过滤键的第二个元素是 True 而第三个元素不等于block:

selected_keys = [i for i in g.keys() if i[1] == True and i[2] != block]

然后你可以通过你过滤的每个键来访问字典。

例如:

for key in selected_keys:
    print(g[key])

将打印与每个键关联的值。

【讨论】:

    【解决方案2】:
    def remove(key, value):
        return key[1] == True and key[2] != block
    
    g = {key:value for key,value in g.iteritems() if not remove(key, value)}
    

    【讨论】:

      【解决方案3】:

      这样做的一个非常简单的方法是。

      for entry in d.keys():
          if entry[1]==True and entry[2]!=block:
              del d[entry]
      

      在这种情况下for循环需要读取keys()方法,所以字典大小的改变不会影响循环。

      希望对你有帮助。

      【讨论】:

        【解决方案4】:

        一些基本的文本处理会让你得到一个像这样的漂亮 csv:

        a,b,action1,c,d,action2,e,f,g,h,i,j
        0,True,fire,0,True,fire,1,1,1,1,1,1
        0,True,fire,0,True,block,1,1,1,1,1,1
        0,True,fire,0,True,reload,1,1,1,1,1,1
        0,True,fire,0,True,fire,1,1,1,1,1,1
        0,True,fire,0,True,block,1,1,1,1,1,1
        0,True,fire,0,True,reload,1,1,1,1,1,1
        0,True,fire,1,True,fire,1,1,1,1,1,1
        0,True,fire,1,True,block,1,1,1,1,1,1
        0,True,fire,1,True,reload,1,1,1,1,1,1
        0,True,fire,1,True,fire,1,1,1,1,1,1
        

        这可以通过pandas.read_csv读入。显然我的列名是垃圾。一旦我们有了一个数据框,我们就可以很容易地按列值对其进行细分。您的查询只是df[df.b & (df.action1 != 'block')

        【讨论】:

          猜你喜欢
          • 2013-12-23
          • 1970-01-01
          • 2018-12-04
          • 2011-02-28
          • 1970-01-01
          • 2010-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多