2013-02-13 3 views
13

여러 변수를 목록에 추가하고 싶습니다. 변수의 수는 다양합니다. 모든 변수는 "volume"으로 시작합니다. 아마도 와일드 카드 나 뭔가가 그럴 것이라고 생각했습니다. 그러나 나는 이런 것을 발견 할 수 없었다. 어떤 아이디어가 이것을 해결하는 방법? 이 예제에서는 세 변수이지만 5 또는 6 또는 그 밖의 값을 사용할 수도 있습니다.여러 변수를 파이썬의 목록에 추가하십시오.

volumeA = 100 
volumeB = 20 
volumeC = 10 

vol = [] 

vol.append(volume*) 
+1

당신이 당신의 상황에 더 가까운 예를 들어 줄 수 있다면 그것은 도움이 될 수 있습니다. 즉, 이름이 알려지지 않은 가변 개수의 변수로 어떻게 끝났습니까? –

답변

13

출력 :

vol.extend((volumeA, volumeB, volumeC)) 

당신의 변수 이름의 접두사 나에게 나쁜 코드 냄새를하고있다 따라 그러나 당신은 그것을 할 수 있습니다. (값이 추가되는 순서는 정의되지 않습니다.)

vol.extend(value for name, value in locals().items() if name.startswith('volume')) 

순서 (IMHO는 여전히 잘못된 냄새) 중요 경우

vol.extend(value for name, value in sorted(locals().items(), key=lambda item: item[0]) if name.startswith('volume')) 
4

당신이 할 수 있지만

vol = [] 
vol += [val for name, val in globals().items() if name.startswith('volume')] 
# replace globals() with locals() if this is in a function 

훨씬 더 좋은 방법은 유사 이름의 변수 대신 사전을 사용하는 것입니다 :

volume = { 
    'A': 100, 
    'B': 20, 
    'C': 10 
} 

vol = [] 
vol += volume.values() 

참고 후자의 경우 순서대로 의 항목이 지정되지 않은 경우, 즉 [100,10,20] 또는 [10,20,100]을 얻을 수 있습니다. 키의 순서로 항목을 추가하려면 사용 : 그것은이 끔찍한 아이디어라고 강조되면서

vol += [volume[key] for key in sorted(volume)] 
+1

+1; 이름이 일종의 순서에있는 많은 변수가 있다면, 당신은 거의 틀리게 그것을하고 있습니다. – geoffspear

+1

변수는 다른 계산 결과입니다 (여기서는 게시하지 않았습니다). 사전을 사용하면 먼저 문제를 사전에 넣었습니다. – ustroetz

3

편집는 지능형리스트에서 filter를 제거했습니다.

다른 답변과 너무 비슷하지 않도록 변경했습니다.

volumeA = 100 
volumeB = 20 
volumeC = 10 

lst = map(lambda x : x[1], filter(lambda x : x[0].startswith('volume'), globals().items())) 
print lst 

당신은 목록에있는 반복자를 추가 extend을 사용할 수 있습니다

[100, 10, 20] 
+3

내면에서 필터 호출을하면 슬픈 표정이됩니다 ... – JBernardo

+0

당신의 의견은 내가 얼마나 틀린 지 깨닫게합니다. D - 내일은 발렌타인 데이입니다. – sotapme

+0

'filter'를 계속 사용하기 위해'map'을 사용하는 것으로 전환하는 것은 더욱 끔찍합니다. JBernardo의 요지는 comprehension에 이미 선택적 if 절이 내장되어 있으므로 'filter'대신 사용하는 것입니다. –

0

을 사용하면 변수의 이름을 추가 할뿐만 아니라 싶어 그들의 가치?

output=[] 

output.append([(k,v) for k,v in globals().items() if k.startswith('volume')]) 

하거나 값 :

output.append([v for k,v in globals().items() if k.startswith('volume')]) 
관련 문제