как создать подсписок для определенной строки во вложенном списке - PullRequest
1 голос
/ 26 марта 2012

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

[['22', '1'], ['21', '15'], ['11', '3'], ['31', '4'], ['41', '13'],...]

Первое, что я хочу сделать, это создать подсписок, который содержит только «1», соответствующий второму элементу во вложенном списке.Я смог сделать это с помощью следующей команды:

Subbasin_1 = []
Subbasin_1.append([x for x in Subbasins_Imp if x[1] == '1'])
print Subbasin_1

Дать эти результаты, которые являются правильными:

[['21', '1'], ['21', '1'], ['21', '1'], ['21', '1'], ['22', '1'],...]

Теперь я хочу создать еще один подсписок, который даст мне все'21' в каждом вложенном списке для Subbasin_1.Когда я использую ту же строку сценария, но меняю соответствующие элементы, я получаю пустой список.Не уверен, что происходит ...?

OS_Count1 = []
OS_Count1.append([x for x in Subbasin_1 if x[0] == '21'])
print OS_Count1

Результат [[]] ???В чем разница между двумя?Спасибо за любую помощь ...

Ответы [ 4 ]

3 голосов
/ 26 марта 2012

Я не верю, что ваш

[['21', '1'], ['21', '1'], ['21', '1'], ['21', '1'], ['22', '1'],...]

строка может быть получена из кода, который вы дали Ваша строка Subbasin_1.append добавляет список к пустому списку Subbasin_1, поэтому вы должны получить что-то вроде

[[['22', '1'], ['21', '1']]]

с одним дополнительным уровнем вложенности.

Если вы избегаете ненужной конструкции пустого списка + добавления, вы должны получить то, что хотите:

>>> Subbasins_Imp = [['22', '1'], ['21', '15'], ['11', '3'], ['31', '4'], ['41', '13'], ['21', '1']]
>>> 
>>> Subbasin_1 = [x for x in Subbasins_Imp if x[1] == '1']
>>> print Subbasin_1
[['22', '1'], ['21', '1']]
>>> OS_Count1 = [x for x in Subbasin_1 if x[0] == '21']
>>> print OS_Count1
[['21', '1']]

В качестве альтернативы, вы можете просто заменить append на extension. Я не рекомендую это, но это может помочь вам увидеть, что происходит:

>>> Subbasins_Imp = [['22', '1'], ['21', '15'], ['11', '3'], ['31', '4'], ['41', '13'], ['21', '1']]
>>> 
>>> Subbasin_1 = []
>>> Subbasin_1.extend([x for x in Subbasins_Imp if x[1] == '1'])
>>> print Subbasin_1
[['22', '1'], ['21', '1']]
>>> 
>>> OS_Count1 = []
>>> OS_Count1.extend([x for x in Subbasin_1 if x[0] == '21'])
>>> print OS_Count1
[['21', '1']]
2 голосов
/ 26 марта 2012

Запустив ваш код, я получил тройной вложенный список ....

Sub = [[['21','1'],....]]

Вместо выполнения:

  Subbasin_1 = []
  Subbasin_1.append([x for x in Sub if x[1]=='1'])

Просто выполните понимание списка:

Subbasin_1 = [x for x in Sub if x[1] == '1']

Это даст вам ожидаемый результат.

2 голосов
/ 26 марта 2012

Ваше понимание списка [x for x in Subbasins_Imp if x[1] == '1'] создает список самостоятельно, что означает, что когда вы добавляете этот список к Subbasin_1, вы получаете список с двойным вложением.

Сравнение:

sub_imp = [['22', '1'], ['21', '15'], ['11', '3'], ['31', '4'], ['41', '13']]
sub_1 = [x for x in sub_imp if x[1] == '1']
sub_2 = []
sub_2.append([x for x in sub_imp if x[1] == '1'])

print(sub_1)
print(sub_2)
0 голосов
/ 26 марта 2012

Нет разницы, которая подразумевает, что Subbasin_1 может быть пустым во время вызова или не содержит данных, которые, по вашему мнению, содержат. Также возможно, что Subbasin_1 вложен в 3 слоя, а не в 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...