猿问

按键值拆分字典列表 - 与 pop 一样?

我见过的Python:从列表中删除词典和拆分字典列表进入字典的若干名单-但这个问题略有不同。


考虑这个工作示例(在 Python 2 或 3 中相同):


#!/usr/bin/env python

from __future__ import print_function


origarr = [

  { 'name': 'test01', 'type': 0, 'value': 42 },

  { 'name': 'test02', 'type': 0, 'value': 142 },

  { 'name': 'test03', 'type': 2, 'value': 242 },

  { 'name': 'test04', 'type': 2, 'value': 342 },

  { 'name': 'test05', 'type': 3, 'value': 42 },

]


print("origarr: {}".format(origarr))


lastdictelem = origarr.pop()


print("\nlastdictelem: {}".format(lastdictelem))

print("after pop, origarr: {}".format(origarr))


namestofilter = [ 'test01', 'test02' ]

newarr = []

for iname in namestofilter:

  # find the object having the name iname

  foundidx = -1

  for ix, idict in enumerate(origarr):

    if idict.get('name') == iname:

      foundidx = ix

      break

  if foundidx > -1:

    # remove dict object via pop at index, save removed object

    remdict = origarr.pop(foundidx)

    # add removed object to newarr:

    newarr.append(remdict)


print("\nafter namestofilter:")

print("newarr: {}".format(newarr))

print("origarr: {}".format(origarr))


现在,我想做的是定义一个数组,其中name包含字典中键的值(例如,namestofilter = [ 'test01', 'test02' ]),并将这些字典从原始数组/列表中删除,然后放入新的数组/列表中(就像.pop()会做的那样带有单个元素和对象引用)。


由于pop删除特定索引处的项目并返回它,因此上面的代码正是这样做的 - 并且有效:


...

after namestofilter:

newarr: [{'name': 'test01', 'type': 0, 'value': 42}, {'name': 'test02', 'type': 0, 'value': 142}]

origarr: [{'name': 'test03', 'type': 2, 'value': 242}, {'name': 'test04', 'type': 2, 'value': 342}]

...但我想知道 - 除了“手动” -for循环遍历两个数组并单独调用.pop()/ .append()(如示例中所做的那样)之外,是否有更紧凑的方法来做到这一点?


POPMUISE
浏览 204回答 1
1回答

慕妹3146593

我不确定有没有办法让它紧凑 - 可能不是。但是你可以稍微简化一下代码,也不要O(n)为每个花费.pop:origarr = [  { 'name': 'test01', 'type': 0, 'value': 42 },  { 'name': 'test02', 'type': 0, 'value': 142 },  { 'name': 'test03', 'type': 2, 'value': 242 },  { 'name': 'test04', 'type': 2, 'value': 342 },  { 'name': 'test05', 'type': 3, 'value': 42 },]namestofilter = set([ 'test01', 'test02' ]). # could be a list as in questionprint("origarr: {}".format(origarr))lastdictelem = origarr.pop()print("\nlastdictelem: {}".format(lastdictelem))print("after pop, origarr: {}".format(origarr))shift = 0newarr = []for ix, idict in enumerate(origarr):    if idict['name'] in namestofilter:        shift += 1        newarr.append(idict)        continue    origarr[ix-shift] = origarr[ix]origarr = origarr[:-shift]  # perhaps it is a slicing O(n) copy overhead print("\nafter namestofilter:")print("newarr: {}".format(newarr))print("origarr: {}".format(origarr))输出:origarr: [{'name': 'test01', 'type': 0, 'value': 42}, {'name': 'test02', 'type': 0, 'value': 142}, {'name': 'test03', 'type': 2, 'value': 242}, {'name': 'test04', 'type': 2, 'value': 342}, {'name': 'test05', 'type': 3, 'value': 42}]lastdictelem: {'name': 'test05', 'type': 3, 'value': 42}after pop, origarr: [{'name': 'test01', 'type': 0, 'value': 42}, {'name': 'test02', 'type': 0, 'value': 142}, {'name': 'test03', 'type': 2, 'value': 242}, {'name': 'test04', 'type': 2, 'value': 342}]after namestofilter:newarr: [{'name': 'test01', 'type': 0, 'value': 42}, {'name': 'test02', 'type': 0, 'value': 142}]origarr: [{'name': 'test03', 'type': 2, 'value': 242}, {'name': 'test04', 'type': 2, 'value': 342}]
随时随地看视频慕课网APP

相关分类

Python
我要回答