Python: 遍历字典中所有列表以同时按顺序过滤元素

2024-07-08 11:28:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些字典

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

我想用python3遍历每个列表中的所有元素,当某个给定索引处的元素等于0时,我想删除字典中列表/属性的all索引处的元素。所以这本字典最后成了

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)

Tags: in元素列表for字典foo1somedictfoo2
3条回答

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

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

其他选项,更详细和破坏性(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]}

下面是一句厚颜无耻的话:

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

相关问题 更多 >

    热门问题