Нарезка списка с использованием переменной в 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
вставляется в фигурные скобки. Он обрабатывает в точности обычный синтаксис нарезки, разделенный двоеточиями, поскольку просто вставляет эту строку, содержащую двоеточие, как есть.