Нарезка списка с использованием переменной в Python

Учитывая список

a = range(10)

Вы можете нарезать его, используя такие выражения, как

a[1]
a[2:4]

Тем не менее, я хочу сделать это на основе переменной, установленной в другом месте кода. Я легко могу сделать это для первого

i = 1
a[i]

Но как мне сделать это для другого? Я пытался индексировать со списком:

i = [2, 3, 4]
a[i]

Но это не работает. Я также попытался использовать строку:

i = "2:4"
a[i]

Но это тоже не работает.

Это возможно?

4 ответа

Решение

Это то что slice() для:

a = range(10)
s = slice(2,4)
print a[s]

Это так же, как использование a[2:4],

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

i, j = 2, 4
a[i:j]

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

Приведенные ниже назначения все еще используют тот же тип операций среза, который вы показываете, но теперь с переменными для значений.

a = range(10)
i = 2
j = 4

затем

print a[i:j]
[2, 3]
>>> a=range(10)
>>> i=[2,3,4]

>>> a[i[0]:i[-1]]
range(2, 4)

>>> list(a[i[0]:i[-1]])
[2, 3]

Я недавно столкнулся с этим, когда искал, как заставить пользователя имитировать обычный синтаксис фрагмента a:b:c, ::cи т. д. через аргументы, переданные в командной строке.

Аргумент читается как строка, и я бы предпочел не разбивать на ':', передайте это slice()и т.д. Кроме того, если пользователь передает одно целое числоi, предполагаемое значение ясно a[i]. Тем не менее,slice(i) по умолчанию будет slice(None,i,None), что не является желаемым результатом.

В любом случае, самое простое решение, которое я мог придумать, - это прочитать строку как переменную st скажем, а затем восстановить нужный фрагмент списка как eval(f"a[{st}]").

Здесь используется встроенная функция eval() и f-строка, гдеstвставляется в фигурные скобки. Он обрабатывает в точности обычный синтаксис нарезки, разделенный двоеточиями, поскольку просто вставляет эту строку, содержащую двоеточие, как есть.

Другие вопросы по тегам