2015-04-21 5 views
-1

Извините, если это уже было задано, я не мог найти его нигде. В основном, как мне получить 2 отдельных диапазона в списке в Python.Python Список индексирования нескольких диапазонов

Если я хочу, 1-й, 2-й, 5-й и 6-й элементы списка, я знаю, что могу это сделать,

l = range(0,15) 
l[1:3]+l[5:7] 

, но это предполагает, что л легко писать. Однако я сбрасываю что-то с веб-страницы с помощью BeautifulSoup4, поэтому я использую soup.find_all (который дает мне список), поэтому я не могу просто написать 2 списка, l и объединить их.

Я хочу получить ответ, что это что-то вроде

l = range(0,15) 
l[1:3,5:7] 

(но, конечно, без ошибок) :)

+3

Что не так с 'l [1: 3] + l [5: 7]'? –

ответ

3

Это может быть то, что вы хотите. itemgetter создает функцию, которая извлекает перечисленные показатели:

>>> import operator 
>>> snip = operator.itemgetter(1,2,5,6) 
>>> snip(range(15)) 
(1, 2, 5, 6) 
>>> snip('abcdefg') 
('b', 'c', 'f', 'g') 
>>> snip([1,2,3,4,5,6,7,8]) 
(2, 3, 6, 7) 
1
l = range(0, 15) 
print([l[i] for i in [1,2, 5,6]]) 

Не знаю, почему вы думаете l[1:3]+l[5:7] это трудно, find_all возвращает обычный список python, как и любой другой.

Или с помощью карты:

l = range(0, 15) 
print(list(map(l.__getitem__,(1,2,5,6)))) 
1

Я хотел бы сделать это с помощью функции:

def multi_range(l, *args): 
    output = [] 
    for indices in args: 
     output += l[indices[0]:indices[1]] 
    return output 

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

long_list_name = range(0, 15) 
print multi_range(long_list_name, (1, 3), (5, 7)) 
>>> [1, 2, 5, 6] 
Смежные вопросы