为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

POPMUISE 2021-10-19 15:18:27
我见过的Python:从列表中删除词典和拆分字典列表进入字典的若干名单-但这个问题略有不同。考虑这个工作示例(在 Python 2 或 3 中相同):#!/usr/bin/env pythonfrom __future__ import print_functionorigarr = [  { '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()(如示例中所做的那样)之外,是否有更紧凑的方法来做到这一点?
查看完整描述

1 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

我不确定有没有办法让它紧凑 - 可能不是。


但是你可以稍微简化一下代码,也不要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 question

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


lastdictelem = origarr.pop()


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

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


shift = 0

newarr = []

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}]



查看完整回答
反对 回复 2021-10-19
  • 1 回答
  • 0 关注
  • 203 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信