Переменные списка Python в работах по шаблону (Python эквивалент R ls (pattern = «namepattern»)

1

Что такое команда python для перечисления всех переменных, существующих в текущем worskpace, которые соответствуют определенному шаблону? Например, перечислите все существующие переменные/объекты в рабочей области, которые начинаются с "ABC",

  • 0
    Вы ищете все переменные с именами, которые начинаются с «ABC» или все переменные со значениями, которые начинаются с «ABC».
  • 0
    оба [IGNORExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]
Теги:

2 ответа

2

Вы можете создать копию локальных varibals, вызвав copy на locals() (или globals() альтернативы) для поиска по паре ключей значений имен переменных и значений, а затем делать то, что вы хотите, с результирующим словарем

import copy
ABCD = 'woof' # create the name and value of our var
local_dict = copy.copy(locals()) # create a shallow copy of all local variables, you don't want to iterate through a constantly changing dict
for name, value in d.items():
    if name.startswith('ABC'):
         print(name, value)

Вызов help(locals) дает вам это как объяснение:

locals()
    Return a dictionary containing the current scope local variables.

    NOTE: Whether or not updates to this dictionary will affect name lookups in
    the local scope and vice-versa is *implementation dependent* and not
    covered by any backwards compatibility guarantees.

РЕДАКТИРОВАТЬ:

здесь короткое oneliner только для имени: [name for name in copy.copy(locals().keys()) if name.startswith('ABC')]

  • 0
    Можете ли вы объяснить, почему вы думаете, что вы должны скопировать данные? Кроме того, зачем копировать все, если вы можете просто скопировать имена?
  • 0
    Большое спасибо! Это поможет Хотя я нахожу поразительным, что вам нужно написать собственную функцию для чего-то такого простого и понятного. Я полагаю, возможность улучшения для Python
Показать ещё 1 комментарий
1

Поиск по переменным

В R, ls(pattern=...) выполняет две вещи:

  1. Если он вызван внутри функции, он ищет локали этой функции.
  2. Если вызывается с верхнего уровня, он просматривает переменные рабочей области (все глобальные)

так

alpha <- 1.
animal <- "dog"
tool <- "wrench"

ls(pattern="^a.*")
# "alpha"  "animal"

myfunction <- function(){
    value <- 1
    ls(pattern="value")
}

myfunction()
# "value"

оба случая можно сделать в Python путем поиска через locals():

import re

alpha = 1.
animal = "dog"
tool = "wrench"

[x for x in locals() if re.match('^a.*', x)]
# ['alpha', 'animal']

def function():
    value = 1
    print([x for x in locals() if re.match('value', x)])

function()
# ['value']

Запись функции ls(...)

К сожалению, вы не можете реализовать такую функцию, как ls() в Python, которая ищет через locals() поскольку, как только вы входите в эту функцию, текущая область данных теряется и вы получаете локальные переменные ls():

def ls(pattern='.*'):
    return [x for x in locals() if re.match(pattern, x)]

def function():
    value = 1
    print(ls())

function()
# ['pattern']    <- This is actually in scope of 'ls()', not of 'function()'

ls()
# ['pattern']    <- This is actually in scope of 'ls()', not in global scope

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

import inspect

def ls(pattern='.*'):
    return [x for x in inspect.currentframe().f_back.f_locals if re.match(pattern, x)]

def function():
    value = 1
    print(ls())

function()
# ['value']    <- This is in scope of 'function()'

ls()
# ['ls', 'function', ...]    <- This is in global scope

Ещё вопросы

Сообщество Overcoder
Наверх
Меню