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

Python:同时循环遍历字典中的所有列表以过滤掉元素

Python:同时循环遍历字典中的所有列表以过滤掉元素

牧羊人nacy 2021-09-14 16:32:43
我有一些字典someDict = {    'foo1': [1, 4, 7, 0, -2],    'foo2': [0, 2, 5, 3, 6],    'foo3': [1, 2, 3, 4, 5]}我想用 Python 3 遍历每个列表中的所有元素,当某个给定索引处的元素为零时,我想删除字典中所有列表/属性的该索引处的元素。这样字典就变成了someDict = {    'foo1': [4, 7, -2],    'foo2': [2, 5, 6],    'foo3': [2, 3, 5]}请注意,我事先不知道字典将有多少个键/列表,也不知道列表将包含多少个元素。我想出了以下代码,它似乎有效,但想知道是否有更有效的方法来做到这一点?keyPropList = someDict.items()totalList = []for tupleElement in keyPropList:    totalList.append(tupleElement[1])copyTotalList = totalList[:]for outerRow in copyTotalList:    for outerIndex, outerElement in enumerate(outerRow):        if outerElement==0:            for innerIndex, _ in enumerate(copyTotalList):                del totalList[innerIndex][outerIndex]print('someDict =', someDict)
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

您可以找到一个“禁止”索引列表,然后可用于过滤结构:


someDict = {

  'foo1': [1, 4, 7, 0, -2],

  'foo2': [0, 2, 5, 3, 6],

  'foo3': [1, 2, 3, 4, 5]

}

results = {i for c in someDict.values() for i, a in enumerate(c) if not a}

new_dict = {a:[c for i, c in enumerate(b) if i not in results] for a, b in someDict.items()}

输出:


{'foo1': [4, 7, -2], 'foo2': [2, 5, 6], 'foo3': [2, 3, 5]}


查看完整回答
反对 回复 2021-09-14
?
慕仙森

TA贡献1827条经验 获得超7个赞

这是一个厚颜无耻的单线:


>>> dict(zip(someDict, map(list, zip(*(ts for ts in zip(*someDict.values()) if all(ts))))))

{'foo3': [2, 3, 5], 'foo1': [4, 7, -2], 'foo2': [2, 5, 6]}

>>>


查看完整回答
反对 回复 2021-09-14
?
RISEBY

TA贡献1856条经验 获得超5个赞

其他选项,更详细和更具破坏性的 ( pop) 用于original_dict:


some_dict = {

    'foo1': [1, 0, 2, 3, -2],

    'foo2': [0, 2, 5, 3, 6],

    'foo3': [1, 2, 3, 0, 5]

}


for k, v in some_dict.items():

  id = []

  for i, e in enumerate(v):

    if e == 0: id.append(i-len(id))

  [ [ some_dict[k].pop(x) for x in id ] for k,v in some_dict.items() ]


print(some_dict)

#=> {'foo1': [2, -2], 'foo2': [5, 6], 'foo3': [3, 5]}


查看完整回答
反对 回复 2021-09-14
  • 3 回答
  • 0 关注
  • 294 浏览
慕课专栏
更多

添加回答

举报

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