2013-07-06 3 views
-3

나는 축구에 관련된 통계를 가지고 있습니다. 플레이어와 각 스탯의 이름을 두 개 이상의 공백으로 나눌 수 있습니다. 나는 야드 지도자를 얻으려고 노력하고 있으므로 4 열 또는 3 열로 정렬해야합니다. 나는 두 가지 오류를 얻을 수Python, sorted() : 세 번째 열의 축구 통계 정렬

abel161 8 77 443.0 5 0 11.7 147.2 
Abyss ll 38 145 1158.0 11 6 12.8 55.9 
AFFISHAUL 34 33 366.0 2 4 17.8 22.7 
Assassin NinjaX 25 35 184.0 0 7 10.3 15.1 
aubby57 23 165 839.0 11 0 10.5 75.3 
B1U3 S4V10R 26 116 380.0 4 6 6.0 29.2 
Bigkle 24 47 149.0 2 4 6.7 32.8 
BLKSUP3RSA1YAN 5 52 65.0 3 1 9.9 22.7 
Booksack 33 85 477.0 5 5 11.0 29.2 
Brandon6154xx 23 106 809.0 8 0 17.6 97.0 
budweizerbeast 35 472 1640.0 27 9 6.8 94.5 
BulkKiller1 31 455 3012.0 40 5 12.6 182.6 
Carnage311 30 369 2349.0 25 6 12.8 158.3 
cinemagiic 32 12 -8.0 0 2 -1.3 -0.6 
Cmfc bumble bee 20 41 253.0 1 0 12.3 28.9 
CMFCplaya 19 78 366.0 4 4 9.5 48.9 

:

import re, sys 
try: 
    file = open("TTL.txt", "r") 
except IOError: 
    print "Could Not Open TTL" 
sys.exit() 
lines = file.readlines() 
for line in lines: 
    line = re.split("\s\s+", line) 
def key_fct(lines): 
    return (float(lines[3])) 
srtlines = sorted(lines, key = key_fct, reverse = True) 
for line in srtlines: 
    print line 
file.close() 

샘플 입력 : 여기

내 코드의

$./sort.py 
Traceback (most recent call last): 
    File "./sort.py", line 39, in <module> 
    srtlines = sorted(lines, key = key_fct, reverse=True) 
    File "./sort.py", line 37, in key_fct 
    return (float(lines[3])) 
ValueError: invalid literal for float(): l 

내 파일 목록의 목록 아니지만, 분할하는 경우 각 줄을 정렬하고 세 번째 인덱스로 정렬하려고하면 파일의 이름에 네 번째 문자가 계속 표시됩니다.

for line in lines: 
    line = re.split("\s\s+", line) 

이 목록에 선을 재 할당이 예상되지 않는 :

+2

을했을 :

여기에 문제를 처리하는 다른 방법이있다? 당신의 문제는 정확히 무엇입니까? –

+0

파이썬에서 파일을 작업 할 때는 항상 [with with'statement] (http://www.youtube.com/watch?v=lRaKmobSXF4)를 사용해야합니다. 또한 [csv 모듈] (http://docs.python.org/3.3/library/csv.html)을 사용하면 쉽게 사용할 수 있습니다. –

답변

0

코드의 문제, 당신은 lines 반복하지만 수정되지 않습니다 루프 내부 line에 새 값을 할당하고있다 원본 목록의 내용. 여전히 문자열 목록이므로 lines[3]은 예상대로 세 번째 항목이 아닌 각 줄의 세 번째 문자를 실제로 반환합니다.

lines = file.readlines() 
for line in lines: 
    line = re.split("\s\s+", line) #This thing won't affect original list 

당신은 할 수 있습니다 :

lines = file.readlines() 
for i,line in enumerate(lines): 
    lines[i] = re.split("\s\s+", line) 

또는 더 나은 :

import re 
with open('abc') as f: 
    lines = [re.split("\s\s+", line) for line in f] 
    lines.sort(key = lambda x: float(x[3]), reverse = True)  
    print lis 
0

당신이 가지고있는 문제는 다음과 같은 코드입니다. 실제로 라인을 바꾸는 것은 아닙니다.

splitLines = [] 
for line in lines: 
    splitLines.append(re.split("\s\s+", line)) 

또는 대신 인덱스를 사용 : 내가 좋을 것은이 같은 새로운 목록을 작성입니다

for i in range(len(lines)): 
    lines[i] = re.split("\s\s+", lines[i]) 

희망이 당신을 도와줍니다!

+2

인덱스에 의한 반복은 좋은 생각이 아닙니다. 유연성이없고 읽기가 어렵고 느립니다. –

1

귀하의 문제는 여기에 있습니다 :

for line in lines: 
    line = re.split("\s\s+", line) 

당신은 다음과 같은 목록의 값을 수정할 수 없습니다 - 당신은 단지 그 다음 시간을 교체 변수에 새로운 값을 할당하는 루프가 실행 . 이것은 전혀하지 않습니다. 대신

는 새 목록을 구성하기 위해 list comprehension를 사용

lines = [re.split("\s\s+", line) for line in lines] 
0

다른 사람에 의해 언급 된 문제 외에, 당신은 또한 문제을 분석하는 기본 이 : 고려 그 도적 Cmfc 범블 비엉덩이 assin NinjaX. 데이터 라인을 공백으로 분리하면 이름에 공백이 포함되어 데이터에 너무 많은 필드가 생기게됩니다. 예를 들어, 요소 [3]은 한 데이터 레코드에서 다른 레코드로 일관된 의미를 가지지 않습니다.당신은 무엇을

# Read the data, naively splitting on whitespace. 
with open(sys.argv[1]) as fh: 
    football_data = [line.split() for line in fh] 

# Reorganize the data. 
for i, fd in enumerate(football_data): 
    # stats: the last 7 elements. 
    # name: anything to the left of the stats. 
    stats = [float(n) for n in fd[-7:]] 
    name = ' '.join(fd[0:-7]) 
    football_data[i] = [name] + stats 

# Sort as needed. 
football_data.sort(key = lambda fd: fd[3], reverse = True) 
+0

파일의 모든 이름이 사이에 공백이 하나만 있고 모든 통계에는 두 개 이상의 공백이 있습니다.이 질문에서 언급 한 것 같습니다. – user2556506

+0

하지만 와우는 통계에서 이름을 분리하는 데 많은 도움이됩니다. 실제로 다른 프로그램을 작성하여 통계 사이에 여분의 공백을 추가했습니다. < – user2556506

+0

프로그램에이 코드를 실행하면 다음과 같이 나타납니다. [pereiraa1 @ centos-server LA] $ ./sort.py 트레이스 백 (가장 최근의 마지막 콜) : 파일 "./sort.py", 줄 7, 에있는 n에 대해 float (n) [0-7] : ValueError : float – user2556506