假设我有一个列表,其中每个列表元素由三部分组成,如:
[[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 0, 2], [0, 1, 1], [0, 2, 0], [1, 0, 1], [1, 1, 0], [2, 0, 0], [0, 0, 3], [0, 1, 2], [0, 2, 1], [0, 3, 0], [1, 0, 2], [1, 1, 1], [1, 2, 0], [2, 0, 1], [2, 1, 0], [3, 0, 0], [0, 0, 4], [0, 1, 3], [0, 2, 2], [0, 3, 1], [0, 4, 0], [1, 0, 3], [1, 1, 2], [1, 2, 1], [1, 3, 0], [2, 0, 2], [2, 1, 1], [2, 2, 0], [3, 0, 1], [3, 1, 0], [4, 0, 0]]
是否有办法检查每个列表元素中的内容,即我想创建一个新列表,基于上面包含包含两个零的所有元素的索引位置,以及包含每个元素的列表一零,我该怎么做?
我知道如何检查列表元素中是否存在单个元素,但是如果该元素出现两次则不知道。
答案 0 :(得分:3)
您可以使用.count
方法。
two_zeros = [x for x in lst if x.count(0) == 2]
one_zero = [x for x in lst if x.count(0) == 1]
如果你想变得非常聪明,你可以使用collections.defaultdict在一个循环中完成整个事情:
d = collections.defaultdict(list)
for sublist in lst:
d[sublist.count(0)].append(sublist)
现在您有一个零的数量映射到包含该数量的零的子列表。
当然,如果您确实需要索引列表,可以使用enumerate
。
答案 1 :(得分:2)
使用count()
。
来自help
:
count(...)
L.count(value) -> integer -- return number of occurrences of value
示例代码(列表的一部分) -
>>> startList = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 0, 2], [0, 1, 1], [0, 2, 0], [1, 0, 1], [1, 1, 0], [2, 0, 0], [0, 0, 3], [0, 1, 2], [0, 2, 1]]
>>> for element in startList:
element.count(0)
2
2
2
2
1
2
1
1
2
2
1
1
如何创建列表?将上述想法与列表理解结合使用。
>>> twoZero = [index for index, elem in enumerate(startList) if elem.count(0) == 2]
>>> twoZero
[0, 1, 2, 3, 5, 8, 9]
>>> oneZero = [index for index, elem in enumerate(startList) if elem.count(0) == 1]
>>> oneZero
[4, 6, 7, 10, 11]
这是列表的一部分。
答案 2 :(得分:0)
您可以使用list comprehension,list.count和enumerate:
two_zeros_index = [i for i, item in enumerate(datalist)
if item.count(0) == 2]
但是既然你想创建两个列表,那么一个普通的for循环可能会更好(所以你只需要遍历datalist
一次):
one_zero, two_zeros_index = [], []
for i, item in enumerate(datalist):
n = item.count(0)
if n == 1:
# Every *item* containing one zero
one_zero.append(item)
elif n == 2:
# Every *index* containing two zeros
two_zeros_index.append(i)
答案 3 :(得分:0)
列表reqd
将包含您需要的所有索引:
>>> reqd = []
>>> for i in range(len(d)):
if d[i].count(0) == 2:
reqd.append(i)
>>> reqd
[0, 1, 2, 3, 5, 8, 9, 12, 18, 19, 23, 33]