2014-03-25 3 views
-1

저는 배우와 영화의 이름이 들어있는 파일을 가져와 각 영화에있는 액터의 해시를 구성하는 스크립트가 있습니다. 아래는 현재 코드이며, 사전 크기를 10으로 제한하고 싶습니다. ie. 각 영화의 처음 10 명의 배우 만 사전에 추가 할 수 있습니다. 내가 루프를 시도하고 휴식과 내 방법이 작동하지 않았다.파이썬 사전의 값을 제한합니다.

업데이트, 나는 @의 jonrsharpe의 제안을 통합했지만, 그것은 단지 10 각 영화 배우의 목록을 제한하지 않고 내 사전을 조각 :

movietoactorfile = open('mov2act.pickle', 'w') 
movietoactor = {} 

for line in gzip.open(moviefile_name, 'rb').readlines(): 
    (actor, movie, rank) = line.rstrip('\r\n\s').split('\t') 
    if movie not in movietoactor: 
    movietoactor[movie] = [] 
    movietoactor[movie].append(actor) 

for movie in movietoactor: 
    s = "\t".join(movietoactor[movie][:10]) 

pickle.dump(movietoactor, movietoactorfile) 

Oringinal 샘플 출력 :

S'Irma la Douce (1963)' 
p1 
S"\tDeauville, Sheryl\tEarl, Jane\tEarl, Ruth\tHoliday, Hope\tMacLaine, Shirley\tSatana, Tura\tShawlee, Joan\tWhitney, Grace Lee\tWoods, Susan (I)\tYoung, Harriette\tAlvin, John (I)\tBarrier, Edgar\tBeck, Billy (I)\tBernardi, Herschel\tBixby, Bill\tBrown, James (II)\tCaan, James\tDiamond, Don\tDubov, Paul\tJacobi, Lou\tJourdan, Louis (I)\tKrugman, Lou\tLemmon, Jack (I)\tLerner, Diki\tMcNear, Howard\tMoustache\tO'Dell, Doye\tOsmond, Cliff\tPalma, Joe\tPeel, Richard\tYarnell, Bruce" 
p2 
sS'American Buffalo (1996)' 
p3 
S'\tFranz, Dennis (I)\tHoffman, Dustin\tNelson, Sean (I)' 
을 위의 코드에서

전류 출력 :

S'Irma la Douce (1963)' 
p1 
(lp2 
S'Deauville, Sheryl' 
p3 
aS'Earl, Jane' 
p4 
aS'Earl, Ruth' 
p5 
aS'Holiday, Hope' 
p6 
aS'MacLaine, Shirley' 
p7 
aS'Satana, Tura' 
p8 
aS'Shawlee, Joan' 
p9 
aS'Whitney, Grace Lee' 
p10 
aS'Woods, Susan (I)' 
p11 
aS'Young, Harriette' 
p12 
aS'Alvin, John (I)' 
p13 
aS'Barrier, Edgar' 
p14 
aS'Beck, Billy (I)' 
p15 
aS'Bernardi, Herschel' 
p16 
aS'Bixby, Bill' 
p17 
aS'Brown, James (II)' 
p18 
aS'Caan, James' 
p19 
aS'Diamond, Don' 
p20 
aS'Dubov, Paul' 
p21 
aS'Jacobi, Lou' 
p22 
aS'Jourdan, Louis (I)' 
p23 
aS'Krugman, Lou' 
p24 
aS'Lemmon, Jack (I)' 
p25 
aS'Lerner, Diki' 
p26 
aS'McNear, Howard' 
p27 
aS'Moustache' 
p28 
aS"O'Dell, Doye" 
p29 
aS'Osmond, Cliff' 
p30 
aS'Palma, Joe' 
p31 
aS'Peel, Richard' 
p32 
aS'Yarnell, Bruce' 
p33 
asS'American Buffalo (1996)' 
p34 
(lp35 
S'Franz, Dennis (I)' 
p36 
aS'Hoffman, Dustin' 

목적 outpu t이 좋아한다 :

: 라인의 I = 1 개 외부를 배치 할 제안에 관해서는

S'Irma la Douce (1963)' 
p1 
S"\tDeauville, Sheryl\tEarl, Jane\tEarl, Ruth\tHoliday, Hope\tMacLaine, Shirley\tSatana, Tura\tShawlee, Joan\tWhitney, Grace Lee\tWoods, Susan (I)\tYoung, Harriette" 
p2 
sS'American Buffalo (1996)' 
p3 
S'\tFranz, Dennis (I)\tHoffman, Dustin\tNelson, Sean (I)' 

, 즉 내가 시도 매우 첫번째 편집 여기 내 질문을 게시하기 전에 문제가 해결되지 않았다이었다

movietoactorfile = open('mov2act.pickle', 'w') 
movietoactor = {} 

i = 1 
for line in gzip.open(moviefile_name, 'rb').readlines(): 
    (actor, movie, rank) = line.rstrip('\r\n\s').split('\t') 
    if movie not in movietoactor: 
    movietoactor[movie] = '' 
    movietoactor[movie] += '\t%s' % actor 
    i += 1 
    if i > 10: 
    break 

pickle.dump(movietoactor, movietoactorfile) 

출력 :

S'\tactor' 
p6 
sS'Queen of the Damned (2002)' 
p7 
S'\tAaliyah' 
p8 
sS'Kauas pilvet karkaavat (1996)' 
p9 
S'\tAaltonen, Minna' 
p10 
sS'Class Act (1992)' 
p11 
S'\tAalda, Mariann' 
p12 
sS'Twenty Bucks (1993)' 
p13 
S'\tAabel, Per (II)' 
p14 
sS'South Pacific (1958)' 
p15 
S'\tAadland, Beverly' 
p16 
sS'Tomorrow Never Dies (1997)' 
p17 
S'\tAaltonen, Minna' 
p18 
sS'Romeo Must Die (2000)' 
p19 
S'\tAaliyah' 
p20 
s. 
+4

, 당신이 시도하지 말라 한도.제한하려는 버전을 알려주고 "작동하지 않음"으로 무엇을 의미하는지 말할 수 있습니까? – Djizeus

+0

10 개로 제한하려면 왜 각 영화에 대한 목록을 저장하지 않고 목록의 길이를 테스트해야합니까? – EdChum

+0

@EdChum 루프의 각 반복마다 1로 재설정되고 있다고 생각하지 않습니까? –

답변

1

당신은 ifor 루프를 할 때마다 1을 다시; 최소한의 수정은 외부로 이동하는 것입니다

i = 1 
for line in gzip.open(moviefile_name, 'rb').readlines(): 

편집 :이 작동하지 않습니다, 당신은 파일에 두 개 이상의 영화를 가지고 있기 때문에. 각 영화에 대한 별도의 수를 가질 수 있지만, 당신은뿐만 아니라 한 부분이 건너 뛸 수 있습니다


movie에 대한 목록을 사용하면이 모든 쉬울 것 :

if movie not in movietoactor: 
    movietoactor[movie] = [] 
if len(movietoactor[movie]) < 10: 
    movietoactor[movie].append(actor) 

하는 경우를 귀하의 다른 스크립트는 또한 파이썬에서 구문 분석 절임 된 파일을 시도 할 필요가 없습니다, 그냥 pickle.load 실제 데이터 구조로 돌아가려면 사용하십시오. 데이터를 목록에 남겨 둘 수 있으며, 예를 들어 다른 스크립트를 사용하지 않고 다른 스크립트로 복원 할 수 있습니다. split('\t'). 이로 인해 조작이 훨씬 쉬워 져서 사용의 전체 지점이됩니다 pickle.

파이썬이 아닌 경우 전송에 더 쉽게 사용할 수있는 형식이 있습니다 (예 : csv). 예를 들어 각 줄은 영화 이름으로 시작됩니다 그러면 최대 10 명의 액터가 있습니다 :

'American Buffalo (1996)','Franz, Dennis (I)','Hoffman, Dustin','Nelson, Sean (I)' 

또는 을보십시오. 당신은 정말, 정말 당신이 무엇을 고수 할 경우

, 당신은 pickle 당신에게 전에 문자열로 각 목록을 변환 할 수 있습니다

당신이 보여 코드에서
for movie in movietoactor: 
    movietoactor[movie] = "\t".join(movietoactor[movie]) 
+0

+1을 먼저 추가하는 것이 좋습니다. –

+0

파일에 여러 개의 동영상이 포함되어있는 경우 하나의 동영상에 대한 제한에 도달하면 '중단'하고 싶지 않습니다. 대신 무제한 배우를 추가하고 전체 목록 대신 10 개 이하의 슬라이스에서 문자열을 작성하십시오. 예 :'s = "\ t".join (movietoactor [movie] [: 10])' – Blckknght

+0

@Blckknght 좋은 지적; 편집 됨, 감사합니다 – jonrsharpe

관련 문제