문제

좌표를 나타내는 일련의 Python 튜플이 있습니다.

tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]

다음 목록을 만들고 싶습니다.

l = []
for t in tuples:
  l[ t[0] ][ t[1] ] = something

IndexError가 발생합니다.목록 인덱스가 범위를 벗어났습니다.

내 배경은 PHP이고 Python에서는 인덱스 > 0으로 시작하는 목록을 만들 수 있을 것으로 예상했습니다.틈을 만들고 메우는데, 그럴 수 없는 것 같아요.

아이디어는 나중에 목록을 정렬하는 것입니다.나는 사전을 사용하여 이 작업을 수행할 수 있다는 것을 알고 있지만, 내가 아는 한 사전은 키를 기준으로 정렬할 수 없습니다.업데이트:이제 나는 그들이 할 수 있다는 것을 압니다. 허용된 해결책을 보십시오.

편집하다:내가 원하는 것은 튜플 좌표로 설명된 행렬을 나타내는 2D 배열을 만든 다음 순서대로 반복하는 것입니다.사전을 사용하는 경우 키에 대한 반복이 순서대로 수행된다는 보장은 없습니다. -> (0,0) (0,1) (0,2) (1,0) (1,1) (1,2 ) (2,0) (2,1) (2,2)

누구든지 도와줄 수 있나요?

도움이 되었습니까?

해결책

"그러나 내가 아는 한 사전은 키로 정렬할 수 없습니다"라는 말은 정확히 무엇을 의미합니까?

이것이 "정렬된 사전"과 엄격히 동일하지는 않지만 ~할 수 있다 사전을 키별로 정렬된 목록으로 쉽게 변환할 수 있습니다. 이는 다음과 같습니다.

>>> tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
>>> l = {}
>>> for t in tuples:
...    l[t] = "something"
>>> sorted(l) # equivalent to sorted(l.keys())
[(0, 0), (0, 1), (1, 0), (1, 1), (2, 1)]
>>> sorted(l.items()) # make a list of (key, value) tuples, and sort by key
[((0, 0), 'something'), ((0, 1), 'something'), ((1, 0), 'something'), ((1, 1), 'something'), ((2, 1), 'something')]    

(나는 돌아섰다. something 코드가 작동하도록 문자열 "something"에 추가)

그러나 귀하의 경우에 이것을 사용하려면(내가 올바르게 이해한 경우) 여전히 사전을 None 값 또는 모든 "빈" 좌표 튜플에 대한 무언가로 채워야 합니다.

다른 팁

아니요, 간격으로 목록을 만들 수 없습니다. 그러나 튜플 키로 사전을 만들 수 있습니다.

tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
l = {}
for t in tuples:
    l[t] = something

업데이트:사용해보십시오 Numpy, 매트릭스와 배열에 대한 광범위한 작업을 제공합니다. 현장에서 사용 가능한 Numpy on Numpy의 무료 PFD에서 인용하십시오 (3.4.3 Flat Iterator Indexing) : "앞에서 언급했듯이 X.Flat은 전체 배열에 걸쳐 반복하는 반복기를 반환합니다 (마지막 인덱스가 가장 빠른 인덱스를 가진 C- 연속적인 스타일로". 필요한 것 같아요.

당신은 그런 일을 위해 dicts를 봐야합니다.

for t in tuples:
  if not l.has_key(t[0]):
    l[t[0]] = {}
  l[t[0]][t[1]] = something

그러나 DITT를 반복하는 것은 목록을 반복하는 것과 약간 다릅니다. Keys (), value () 및 items () 함수가 있으면 도움이됩니다.

편집 : 주문을 위해 이와 같은 것을 시도하십시오.

for x in sorted(l.keys()):
   for y in sorted(l[x].keys()):
       print l[x][y]

1 차원 목록을 만듭니다 l 그리고 그것을 2 차원 목록으로 사용하고 싶습니다. 그렇기 때문에 색인 오류가 발생합니다.

다음 옵션이 있습니다. 맵을 만들고 튜플 T를 색인으로 사용하십시오.

l = {}
l[t] = something

그리고 당신은 l로 입력 할 것입니다.

{(1, 1): something}

전통적인 배열 구조를 원한다면 Numpy. Numpy를 사용하면 "전통적인"인덱싱으로 N 차원 어레이가 얻을 수 있습니다.

내가 언급했듯이 Numpy 사용

Numpy를 사용하면 0으로 채워진 2 차원 배열을 만들 수 있습니다. 물론 행과 열 또는 전체 배열을 목록으로 반복 할 수 있습니다.

미리 손에 크기를 알고 있다면 이와 같은 목록 목록을 만들 수 있습니다.

>>> x = 3
>>> y = 3
>>> l = [[None] * x for i in range(y)]
>>> l
[[None, None, None], [None, None, None], [None, None, None]]

그런 다음 원래 제안한 것처럼 반복 할 수 있습니다.

확장 나단대답,

tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
x = max(tuples, key = lambda z : z[0])[0] + 1
y = max(tuples, key = lambda z : z[1])[1] + 1
l = [[None] * y for i in range(x)]

그런 다음 원하는대로 할 수 있습니다

앞에서 언급했듯이 틈이있는 목록을 만들 수 없으며 사전이 더 나은 선택 일 수 있습니다. 요령은 그것을 확인하는 것입니다 l[t[0]] 무언가를 제자리에 놓을 때 존재합니다 t[1]. 이를 위해서는 a를 사용할 것입니다 DefaultDict.

import collections
tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
l = collections.defaultdict(dict)
for t in tuples:
    l[t[0]][t[1]] = something

부터 l if l[t[0]] 존재하지 않으면, 그것은 당신이 당신의 something 위치에서 t[1].

참고 : 이것은 내면의 존재를 위해 손으로 체크하는 사소한 지루함없이 @Unsesen의 답변과 동일하게됩니다. 동시 대답까지 분필.

The dict solutions given are probably best for most purposes. For your issue of iterating over the keys in order, generally you would instead iterate over the coordinate space, not the dict keys, exactly the same way you would have for your list of lists. Use .get and you can specify the default value to use for the blank cells, or alternatively use "collections.defaultdict" to define a default at dict creation time. eg.

for y in range(10):
    for x in range(10):
        value = mydict.get((x,y), some_default_value)
        # or just "value = mydict[x,y]" if used defaultdict

If you do need an actual list of lists, you can construct it directly as below:

max_x, max_y = map(max, zip(*tuples))
l=[[something if (x,y) in tuples else 0 for y in range(max_y+1)] 
     for x in xrange(max_x+1)]

If the list of tuples is likely to be long, the for performance reasons, you may want to use a set for the lookup,as "(x,y) in tuples" performs a scan of the list, rather than a fast lookup by hash. ie, change the second line to:

tuple_set = set(tuples)
l=[[something if (x,y) in tuple_set else 0 for y in range(max_y+1)] 
     for x in xrange(max_x+1)]

나는 당신이 1 차원 목록 만 선언했다고 생각합니다.

나는 당신이 그것을 선언한다고 생각합니다

l = [][]

편집하다: 그것은 구문 오류입니다

>>> l = [][]
  File "<stdin>", line 1
    l = [][]
           ^
SyntaxError: invalid syntax
>>> 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top