2013-06-18 2 views
0

Пусть У меня был список, где каждый элемент списка был составлен из трех частей, как:проверка два значение в списке элементов питона

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

будет ли способ, чтобы проверить, что находится внутри каждый элемент списка т.е. говорит: хотел создать новый список на основе вышеописанного, содержащего позицию индекса всех элементов, содержащих два нуля, а также список каждого элемента, содержащего один ноль, как бы я это сделал?

Я знаю, как проверить, существует ли какая-либо вещь в элементе списка, но нет, если этот элемент встречается дважды.

ответ

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.

+0

Мне нравится, что для цикла, позволит вам узнать, как это происходит ... – user124123

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] 

Это часть для вашего списка.

0

Вы можете использовать list comprehension, list.count и enumerate:

two_zeros_index = [i for i, item in enumerate(datalist) 
        if item.count(0) == 2] 

Но так как вы хотите, чтобы создать два списка, некрасивая стара для петли может быть лучше (так что вы итерацию только через 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) 
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] 
Смежные вопросы