2017-05-21 3 views
-1

다음과 같은 목록이 있습니다. [0,0,0,0,0, 'entrya', 5, 'entryb', 10, 'anotherentry', 7, 'entry', 1, 'entryd', 30, ...., 0,0, 0,0,0,0]Python에서 두 개의 다른 유형으로 목록 정렬

등등. 나는 생각합니다. 내 문제는 지금이 문자열 전체에 해당하는 숫자 뒤에 정렬하려는 것입니다. 결과는 이렇게 보입니다. 'entryb', 10, 'entryd', 30, .... 0, 0, 0, 0] (또는 다른 방법으로) 심지어 무엇이 더 좋을지도 모릅니다.)

내 문제는 분명히 인접한 항목이 함께 있어야하고 사전이이 운동에 허용되지 않는다는 것입니다.

누구나 어떻게 할 수 있습니까?

대단히 감사합니다!

+0

다음 다음 목록을 평평하게, 튜플을 정렬 목록에서 튜플을 만들 수 있습니다. 하지만 시작과 끝에 아무런 연관성이 없으며 0.0 ... –

+0

왜 'entrya', 5'가 결과에서 누락 되었습니까? – RomanPerekhrest

+0

oops 정보를 잊어 버렸습니다. – Plinzelplein

답변

0

원래 목록이 어떻게 구성되는지 잘 모르겠다. 우리가 그것을 x이라고 부르고 모든 짝수 항목 (0, 2, ...)이 문자열이고 모든 홀수 항목 (1, 3, ...)이 앞의 문자열과 연결된 번호 인 경우이 목록을 튜플 다음과 같이 튜플의

y = zip(x[0::2], x[1::2]) 

목록은 Y는 다음 정렬 할 수 있습니다 :

y.sort(key=lambda t: t[1]) 

얻을 것이다 :

[(0, 0), 
(0, 0), 
(0, 0), 
(0, 0), 
(0, 0), 
(0, 0), 
('entry', 1), 
('entrya', 5), 
('anotherentry', 7), 
('entryb', 10), 
('entryd', 30)] 

이 도움이됩니까?

편집 :

다시리스트에 평평하게하려면 다음

z = [entry for tup in y for entry in tup] 
+0

처음에는 홀수 개의 0이 있으므로 작동하지 않습니다. – AChampion

+0

@AChampion 내가 놓친 것 같아서. 목록이 실제로 쌍 목록이면 그것이 의미있는 구조를가집니다. 만약 실제로 아무런 정보도 가지고 있지 않은 임의의 숫자의 0이라면, 우선 데이터의 다른 표현을 찾는 것이 좋습니다. – sigvaldm

+1

아니, 괜찮 았는데, 0의 홀수는 내 잘못 이었어, 미안. 그것은 0의 균등해야합니다 – Plinzelplein

0

내 접근 방식은 다음과 같이 첫 번째 튜플로 목록에 요소를 압축하는 것입니다

[('null', 0), ('null', 0), ('null', 0), ('entrya', 5), ('entryb', 10), ('anotherentry', 7), ...] 

을 그 후, 당신을 두 번째 요소로 요소를 정렬 할 수 있습니다.

ls = [0, 0, 0, 0, 0, 'entrya', 5, 'entryb', 10, 'anotherentry', 7, 
    'entry', 1, 'entryd', 30, 0, 0, 0, 0, 0, 0] 

ls_zip_elem = [] 
for x1, x2 in zip(ls, ls[1:]): 
    if x1 == 0: 
     ls_zip_elem.append(('null', x1)) 
    elif not str(x1).isdigit(): 
     ls_zip_elem.append((x1, x2)) 
    else: 
     pass 
ls_zip_elem_sorted = sorted(ls_zip_elem, key=lambda x: x[1]) # sorted 

# put the list back 
ls_sorted = [] 
for x1, x2 in ls_zip_elem_sorted: 
    if x1 == 'null': 
     ls_sorted.append(x2) 
    else: 
     ls_sorted.extend([x1, x2]) 

# output 
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'entry', 1, 'entrya', 5, 'anotherentry', 7, 
# 'entryb', 10, 'entryd', 30] 
0

이것은 매우 이상한 데이터 세트 것 같아,하지만 당신이 정말로 다음이 필요합니까 가정 : 당신이 처음에 0의를 제거하면
과 끝 다음은 정렬 할 매우 간단합니다 :

>>> l = ['entrya', 5, 'entryb', 10, 'anotherentry', 7, 'entry', 1, 'entryd', 30] 
>>> [b for a in sorted(zip(*[iter(l)]*2), key=lambda x: x[1]) for b in a] 
['entry', 1, 'entrya', 5, 'anotherentry', 7, 'entryb', 10, 'entryd', 30 

다른 entries에 대한 값으로 0이 없다고 가정하면 2 가지 경우로 처리 할 수 ​​있으며, 0이 아닌 모든 것을 두 개로 정렬 한 다음 모두 0을 다시 추가 할 수 있습니다.

>>> l = [0,0,0,0,0,'entrya',5, 'entryb', 10, 'anotherentry', 7, 'entry', 1, 'entryd', 30, 0,0,0,0,0] 
>>> pairs = [b for a in sorted(zip(*[iter(filter(lambda x: x!=0, l))]*2), key=lambda x: x[1]) for b in a] 
>>> zeros = list(filter(lambda x: x == 0, l)) 
>>> pairs + zeros 
['entry', 1, 'entrya', 5, 'anotherentry', 7, 'entryb', 10, 'entryd', 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
0

당신은 원하는 출력을 가지고 operator, zipsorted()에서 functools 모듈, add에서 reduce를 사용할 수 있습니다.

NB :이 솔루션에서

: 당신은 당신의 입력 목록을 구문 분석하고 여기에서 0을 분리해서해야합니다

  • .

    :
  • 그렇다면,
  • 마지막 1 단계의 제로의리스트가 2 단계를 연결하여 두 번째 요소에 기초하여, 그것에 제로없이 데이터로부터 쌍을 생성

이것은 일례이며

from operator import add 
from functools import reduce 

data = [0,0,0,0,0,'entrya',5, 'entryb', 10, 'anotherentry', 7, 'entry', 1, 'entryd', 30, 0,0,0,0,0,0] 
non_zeros, zeros = [k for k in data if k is not 0], [0]*data.count(0) 
pairs = [[k,v] for k,v in zip(non_zeros[::2], non_zeros[1::2])] 

final = reduce(add, sorted(pairs, key= lambda x: x[1])) + zeros 
print(final) 

출력 :

['entry', 1, 'entrya', 5, 'anotherentry', 7, 'entryb', 10, 'entryd', 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
관련 문제