2017-10-13 2 views
2

저는 프로그래밍에 완전히 익숙하지 않습니다 (2 개월 미만 - 독학). 목록의 빈도가 필요한 프로젝트에 참여하고 있습니다. 목록의 첫 번째 두 인덱스에 의해 각 내부 목록에.목록의 목록에서 각 항목의 두 번째 첫 번째 값으로 빈도를 최적화하십시오.

여기 내 목록이다

X = [ '블록'3], [ '거리', 2], [ '램프', 1], [ '거리', 2] [ '산업', 3], [ '공원', 2], [ '공원', 3], [ '산업', 3], [ '블록', 3], [ '거리', 2] [ '램프', 1], [ '거리', 2], [ '산업' 3], [ '공원에서'2]

는 각각의 내부에서의 최초 값은 TITLE 인 두 번째는 통상적 인 값입니다.

당신이 볼 수 있듯이, 그 중 일부는 반복 (중복)되는 것을 볼 수 있습니다.


p = [ '블록', 3, 2], [ '거리', 2, 4], [ '램프'

은이 같은리스트의 출력에서 ​​원하지 1, 2], [ '산업' 3,3], [파크 ', 2, 2], ['공원에서 '3, 1]

주파수가의 제 3 값 WITH 내부리스트의 x, 외부리스트 x. 그래서 여기

내 비 파이썬 (아마도 무딘) 접근 방식 :

x = [['block', 3], ['street', 2], ['lamp',1], ['street', 2], ['industrial', 3], ['park', 2], ['park', 3], ['industrial', 3], ['block', 3], ['street', 2], ['lamp',1], ['street', 2], ['industrial', 3], ['park', 2]] 
p = [] 

for a in x: 
    p.append(a), a.append(x.count(a)) 

print p # checkpoint 

i= 0 
while i < len(p): 
    for j in range(len(p)): 
     if i == j: 
      print i, ' = ', j 
      break 
     else: 
      if p[i][:2] == p[j][:2]: 
       print p[i][:2], '==', p[j][:2] 
       p.pop(i) 
       i = 0 
       j=0 
       break 
    i = i+1 

print p # the list of lists I'm desired 

하지만 내 프로젝트에 대한


, 다른 기능 다음에이 기능이 그들에 비해이 일이 있기 때문에 높은 실행 시간, 특히 광대 한 입력 데이터 세트의 경우.

지식이 부족하여 필자가 작성한 코드를 최적화 할 수 없었기 때문입니다.

그래서이 작업을 수행하는 데 더 빠르고 더 평범한 방법이 있습니까?

답변

1

예, 사전을 사용하십시오. 나는 이 문제를 주문을 가정하고, 그래서는 OrderedDict을 사용하지만 순서는 중요하지 않습니다 경우는 Counter 객체를 고려할 수 있습니다 : 그냥 당신이 그것을 도울 수 있다면 당신은 (파이썬 2에있는주의

>>> from collections import OrderedDict 
>>> counter = OrderedDict() 
>>> for a, b in x: 
...  t = (a, b) 
...  counter[t] = counter.get(t, 0) + 1 
... 
>>> final = [[a, b, v] for (a,b),v in counter.items()] 
>>> final 
[['block', 3, 2], ['street', 2, 4], ['lamp', 1, 2], ['industrial', 3, 3], ['park', 2, 2], ['park', 3, 1]] 

을 , 실제로 파이썬 3을 사용해야한다.) 파이썬 2를 사용하고 있기 때문에 counter.items() 대신 counter.iteritems()을 사용해야한다.

는 는 는

그래서 같은 :

>>> final = [[a, b, count] for (a, b), count in counter.iteritems()] 
>>> final 
[['block', 3, 2], ['street', 2, 4], ['lamp', 1, 2], ['industrial', 3, 3], ['park', 2, 2], ['park', 3, 1]] 

참고를위한 루프 첫 번째 비늘이 차적으로, 그 동안 루프에 관해서는, 나는 그것에 대해 생각처럼 느끼지 않는다, 나는 차뿐만 아니라 어쩌면 생각 ,하지만 아마 더 (당신 때문에 .pop(i))하지만 위의 비늘을 선형 적으로 게시 솔루션입니다. 따라서 훨씬 더 큰 데이터 세트를 효과적으로 처리 할 수 ​​있어야합니다.

+0

답해 주셔서 감사합니다. 코드가 완벽합니다. 그러나 이것을 보았을 때 나는 어떻게되는지 알지 못합니다. 당신의 접근 방식과 비슷한 코드를 작성하는 사고 코딩 능력을 어떻게 향상시킬 수 있습니까? 시간에 따라 달성해야하는이 무엇입니까? –

+1

@AfshinSalehi 많은 연습과 비슷한 문제가 있습니다. –

관련 문제