2015-10-01 11 views
3

Если у меня есть список, как:разбирая список Python

X = [0, 2, 3, 4.0, 1, 0, 3, 0, 0, 0, 2, 1, 5, 2, 6, 0, 2.2, 1] 

Как бы написать код Python, который принимает этот список и находит число последовательных положительных чисел, а затем составляет список, который имеет списки каждый из этих последовательных чисел в нем.

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

[[ 2, 3, 4.0, 1], [3], [ 2, 1, 5, 2, 6], [ 2.2, 1]]. 

Я написал это, чтобы найти все нули, но я не знаю, куда идти оттуда:

zeros = [] 
for i in range(0,len(World)): 
     if z[i]==0: 
      zeros.append(i) 
+1

Не могли бы вы объяснить, что вы пытаетесь сделать более подробно? – khelwood

+0

Я пытаюсь написать функцию, в которой я ввожу список, а затем возвращать количество повторений последовательных чисел в этом списке, а затем возвращать список, содержащий списки этих чисел. – Laura

+3

@ Laura pro-tip: когда кто-то просит более подробно, не просто используйте одни и те же слова в немного другом порядке! – jonrsharpe

ответ

2

Вам не нужно указывать индексы нулей перед началом работы. Вы можете просто сохранить еще один временной список с положительными значениями (больше 0) с момента последнего 0. И затем, когда вы столкнулись с 0, добавьте этот временный список в список результатов и измените этот временный список на новый список. Пример -

result = [] 
temp = [] 
for i in X: 
    if i <= 0: 
     if temp: 
      result.append(temp) 
      temp = [] 
    else: 
     temp.append(i) 
if temp: 
    result.append(temp) 

Demo -

>>> result = [] 
>>> temp = [] 
>>> for i in X: 
...  if i <= 0: 
...   if temp: 
...    result.append(temp) 
...    temp = [] 
...  else: 
...   temp.append(i) 
... 
>>> if temp: 
...  result.append(temp) 
... 
>>> result 
[[2, 3, 4.0, 1], [3], [2, 1, 5, 2, 6], [2.2, 1]] 
7

Там нет необходимости штрафовать нули. Вы можете просто перебираем свой список и поставить положительные числа во временный список, пока не столкнуться с нуля, но как более вещий подход для таких задач, которые вы можете использовать itertools.groupby:

>>> from itertools import groupby 
>>> [list(g) for k,g in groupby(X,key=lambda x:x>0) if k] 
[[2, 3, 4.0, 1], [3], [2, 1, 5, 2, 6], [2.2, 1]] 

Если вы хотите, чтобы это сделать без модуля itertools вы можете использовать следующую функцию, которая работает на основе предыдущего объяснения и дает список temp каждый раз, когда он сталкивается с нулем и, наконец, возвращает генератор, содержит список положительных чисел, который вы можете преобразовать в список, вызвав функцию list :

>>> def grouper(li,temp=[]): 
... for i in li: 
...  if i>0: 
...   temp.append(i) 
...  else: 
...   if temp: yield temp 
...   temp=[] 
... if temp : yield temp 
... 

Демонстрация:

>>> list(grouper(X)) 
[[2, 3, 4.0, 1], [3], [2, 1, 5, 2, 6], [2.2, 1]] 
+1

OP упоминает положительные числа, а не только ненулевые числа! – LondonRob