Python의 변수 이름 목록이 주어지면 변수 이름을 키로 (변수의 값에)로하는 사전을 어떻게 생성합니까?

StackOverflow https://stackoverflow.com/questions/230896

  •  04-07-2019
  •  | 
  •  

문제

다음과 같은 변수 이름 목록이 있습니다.

['foo', 'bar', 'baz']

(원래 변수 목록을 어떻게 변환하는지 물었습니다. 아래 Greg Hewgill의 답변을 참조하십시오.)

키가 변수 이름 (문자열로)이고 값이 변수의 값 인 사전으로 어떻게 변환합니까?

{'foo': foo, 'bar': bar, 'baz': baz}

이제 질문을 다시 시작 했으므로 다음을 생각해 냈습니다.

d = {}
for name in list_of_variable_names:
    d[name] = eval(name)

개선 될 수 있습니까?

업데이트, 내가 왜 이것을하고 싶은지에 대한 질문 (의견으로)에 응답합니다.

나는 종종 비율의 이름과 값을 보간하여 끈으로 % 연산자를 사용하는 것을 발견합니다. 문자열의 이름은 종종 로컬 변수의 이름 일뿐입니다. 그래서 (아래 답변으로) 나는 다음과 같은 것을 할 수 있습니다.

message = '''Name: %(name)s
ZIP: %(zip)s

Dear %(name)s,
...''' % dict((x, locals()[x]) for x in ['name', 'zip'])
도움이 되었습니까?

해결책

필터링을 잊어 버리십시오 locals()! 서식 문자열에 제공하는 사전에는 사용되지 않는 키가 포함됩니다.

>>> name = 'foo'
>>> zip = 123
>>> unused = 'whoops!'
>>> locals()
{'name': 'foo', 'zip': 123, ... 'unused': 'whoops!', ...}
>>> '%(name)s %(zip)i' % locals()
'foo 123'

새로운 F- 스트링 기능 Python 3.6에서 사용 locals() 더 이상 필요하지 않습니다 :

>>> name = 'foo'
>>> zip = 123
>>> unused = 'whoops!'
>>> f'{zip: >5} {name.upper()}'
'  123 FOO'

다른 팁

원래 목록 [foo, bar, baz] 변수가 포함되어 있지 않습니다 이름, 그것은 단지 동일한 것을 언급하는 요소를 포함합니다. 가치 나열된 변수로. 동일한 값을 나타내는 두 가지 변수 이름을 가질 수 있기 때문입니다.

따라서 목록 자체는 다른 이름이 객체에 대한 정보를 포함하지 않습니다. 배열의 첫 번째 요소에는 이름이 있습니다 foo 그러나 그것은 또한 이름이 있습니다 a[0] (배열이 호출된다고 가정합니다 a). 다음 코드를 실행 한 후 quux 또한 동일한 개체를 나타냅니다.

quux = a[0]

업데이트 : 당신이 사용할 수있는 것이 옳습니다 eval() 이를 위해서는 사용이 일반적으로 낙담합니다. Python은 이름이 지정된 특별 회원을 제공합니다 __dict__ 여기에는 현재 모듈의 기호 테이블이 포함되어 있습니다. 그래서 당신은 할 수 있습니다 :

import __main__
d = dict((x, __main__.__dict__[x]) for x in list_of_variable_names)

해야한다 import __main__ 코드가 이름이없는 기본 모듈에 있으면 파이썬의 기발한 것입니다.

목록 또는 발전기 이해력을 사용하여 DICT를 직접 인스턴스화하는 데 사용되는 키, 값 튜플 목록을 작성할 수 있습니다. 가장 좋은 방법은 다음과 같습니다.

dict((name, eval(name)) for name in list_of_variable_names)

또한, 예를 들어, 변수가 로컬 심볼 테이블에 존재한다는 것을 알고 있다면 로컬로부터 직접 변수를 보면 위험한 평가에서 자신을 절약 할 수 있습니다.

dict((name, locals()[name]) for name in list_of_variable_names)

최종 업데이트 후 아래의 답은 실제로 원하는 것이라고 생각합니다. 제어하는 문자열로 문자열 확장에 이것을 사용하는 경우 로컬 ()을 문자열 확장으로 직접 전달하면 원하는 값을 체리로 선택합니다.

그러나이 문자열이 외부 소스 (예 : 번역 파일)에서 나올 수 있다면 로컬을 여과하는 것이 좋습니다 ()

효율적이지는 않지만 호출하지 않습니다 eval:

dict((k,v) for (k,v) in globals().iteritems() if k in list_of_variable_names)

또는

dict((k,v) for (k,v) in vars().iteritems() if k in list_of_variable_names)

당신이 원하는 것에 따라.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top