2017-04-22 2 views
1

사용자 입력 값 집합에서 히스토그램을 플롯하려고합니다.Python : 히스토그램을 아래쪽으로 그려야합니다.

가 좋아, 나는이 내 코드를 업데이트 :

number1 = "" 
number2 = "" 
number3 = "" 
number4 = "" 

numbers = input("Enter a string of positive integers separated by spaces: ") 
print(" ") 
newNum = numbers.split() 

line = 0 
col = 0 
lines = int(max(newNum)) 
length = len(newNum) 

while line<lines: 
    col = 0 
    while col<length: 
     if line<int(newNum[col]): 
      print('* ', end = '') 
     else: 
      print(' ') 
     col = col+1 
    line = line+1 
    print("") 

하지만 코드를 실행할 때이 얻을 :

Enter a string of positive integers separated by spaces: 1 3 20 5 

* * * * 

* * * 

* * * 


* * 


* * 

내가 같이 인쇄 할 내 히스토그램을 얻기 위해 지금 무엇을 놓치고 ? 또한 왜 값을 20으로 인쇄하지 않습니까?

Enter a string of positive integers separated by spaces: 1 3 20 5 

* * * * 
    * * * 
    * * * 
    * * 
    * * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
    * 
+0

당신은 무엇을 시도? 너 어디서 붙어 있니? [묻는 방법] (https://stackoverflow.com/questions/ask/advice?)를 참조하십시오. –

+0

위의 코드는 제가 얻은 것입니다. 나는 그것을 뒤집어 씌울 방법을 모르겠습니다. –

+0

응용 프로그램을 모르지만 막대 그래프에 scipy 또는 matplotlib를 사용하는 옵션이 있습니까? – Kev1n91

답변

0

당신이 col를 재설정 결코 당신의 예에서; 당신은 아마 루프 동안 두 번째를 시작하기 전에 col=0 각 시간을 설정해야합니다 그렇지 않으면 내부 루프가 한 번만 실행

while line<lines: 
    col=0 
    while col<length: 
     ... 

.

중첩 for 루프는 ...

을 그 더 자연스러운 될 수 있으며 행 내부에 인쇄 할 때, 당신은 더 endline 문자를 싶지; print('* ', end='')을 사용하고 모든 행 끝에 빈 print()을 사용해야합니다.

당신은 possilbe 자마자 정수로 숫자를 변환해야합니다 :

newNum = [int(i) for i in numbers.split()] 

그렇지 않으면 max(newNum)'5'를 반환합니다 - 가장 높은 숫자를 문자열에.

print(' ') 문에는 여전히 문자가 누락되어 end=' '입니다.

이렇게하면 문제가 해결됩니다.


더 우아한 버전 - 목록까지 번호 목록을 카운트 다운은 제로 구성

def vertical_histo(number_list): 
    rest = number_list 
    while any(rest): 
     print(' '.join('*' if i else ' ' for i in rest)) 
     rest = [i-1 if i else 0 for i in rest] 

# to get your example, call this function with: 
vertical_histo(number_list=(1, 3, 20, 5))) 

rest는 여전히 각 열

에 대해 표시 할 필요가 *의 양을 보유
rest = (1, 3, 20, 5) # first round 
rest = [0, 0, 17, 2] # after 3 rounds 
# ...etc 
rest = [0, 0, 1, 0] # last round 
rest = [0, 0, 0, 0] # when done 

다음은 모든 반복에서 하나씩 아래로 (오른쪽으로) 이동합니다.

' '.join('*' if i else ' ' for i in ones) 

이는 제로가 아직없는 rest의 모든 항목에 대한 '*' 문자열을 만듭니다. 그렇지 않으면 ' '이 추가됩니다.

any(rest)ones이 0이 아닌 항목을 포함하는 한 True입니다.

0

수동으로 프로그래밍해야합니다.

예를 들어, 우리가 요소보다 작거나 같은 행에 있다면. 이 거친 샘플을 안내해야합니다

line = 0 
col = 0 
lines = max(newNum) 
length = len(newNum) 

return  
while line<lines: 
    while col<length: 
     if line<newNum[col]: 
      print "* ", 
     else: 
      print " ", 
     col = col+1 
    line = line+1 
    print "" 
0

모두에게 감사드립니다!

data = [3, 5, 2] 

얼마나 많은 행을 인쇄하려고

number1 = "" 
number2 = "" 
number3 = "" 
number4 = "" 

numbers = input("Enter a string of positive integers separated by spaces: ") 
print(" ") 
newNum = [int(i) for i in numbers.split()] 

line = 0 
col = 0 
lines = int(max(newNum)) 
length = len(newNum) 

while line<lines: 
    col = 0 
    while col<length: 
     if line<int(newNum[col]): 
      print('* ', end = '') 
     else: 
      print(' ', end = '') 
     col = col+1 
    line = line+1 
    print("") 
0

이의 당신의 히스토그램에서 각 컬럼의 깊이를 포함하는 목록에 이름 data를 들어 보겠습니다 :이 코드와 나는 문제를 해결할 수 있었다 ? 당신이 당신의 행을 계산하는 파이썬을 요구하는 경우에

nrows = max(data) #=> 5 

는, 파이썬은 0에서 시작도없고 nrows-1

for row in range(nrows): print(row) #=> 0 1 2 3 4 

그래서 행에서 멈 춥니 다. 3은 인덱스 row2 및 행 번호와 동일합니다. 4 인덱스 3을 가지고, 지금 히스토그램의 첫 번째 열 생각, 당신이 행 3 번에 '+' 의미 3 '+', 를 인쇄 할 수 있습니다 (즉, row=2)와 (즉, row=3)

행 4 번에서 아무것도 우리 히스토그램

def histogram(data): 
    return '\n'.join(
     ''.join('+' if depth>row else ' ' for depth in data) 
     for row in range(max(data))) 

을 계산하는 함수를 작성할 수 있고, 우리는 그것을 테스트 할 준비가이 분석 후

'+' if (data[col] > row) else ' ' 

In [36]: def histogram(data): 
    ...:   return '\n'.join(
    ...:    ''.join('+' if depth>row else ' ' for depth in data) 
    ...:    for row in range(max(data))) 
    ...: 

In [37]: print(histogram((3,4,5,6))) 
++++ 
++++ 
++++ 
+++ 
    ++ 
    + 

In [38]: 

또는 짧은

In [38]: def histogram(d, nl='\n'.join, jn=''.join): 
...:  return nl(jn('+'if n>r else' 'for n in d)for r in range(max(d))) 
...: 

In [39]: print(histogram((3,4,5,6))) 
++++ 
++++ 
++++ 
+++ 
    ++ 
    + 

In [40]: 
관련 문제