복붙노트

[PYTHON] 파이썬에서 빈리스트의리스트 또는 튜플을 만드는 방법은?

PYTHON

파이썬에서 빈리스트의리스트 또는 튜플을 만드는 방법은?

점진적으로 목록 또는 목록의 튜플을 채울 필요가 있습니다. 다음과 같은 것 :

result = []
firstTime = True
for i in range(x):
    for j in someListOfElements:
        if firstTime:
            result.append([f(j)])
        else:
            result[i].append(j)

덜 모호하게 만들기 위해 빈 목록을 미리 할당 할 생각이었습니다.

result = createListOfEmptyLists(x)
for i in range(x):
    for j in someListOfElements:
        result[i].append(j)

사전 할당 부분은 나에게 분명하지 않습니다. 결과 = [[]] * x 일 때 같은 목록에 대한 x 개의 참조 목록을 수신하므로 다음과 같은 결과가 출력됩니다.

result[0].append(10)
print result

:

[[10], [10], [10], [10], [10], [10], [10], [10], [10], [10]]

나는 루프를 사용할 수있다. (결과는 [range (x)에서 i에 대해 [[]를 사용한다.) 그러나 "loopless"솔루션이 존재하는지 궁금하다.

내가 찾는 것을 얻을 수있는 유일한 방법인가?

해결법

  1. ==============================

    1.

    result = [list(someListOfElements) for _ in xrange(x)]
    

    이렇게하면 x 개의 별개 목록이 만들어지며 각 목록에는 someListOfElements 목록이 있습니다 (목록의 각 항목은 참조 용이지만 목록은 사본입니다).

    그것이 더 합리적이라면, copy.deepcopy (someListOfElements)

    발전기와리스트 보급과 같은 것들은 꽤 파이썬으로 간주됩니다.

  2. ==============================

    2.어떤 종류의 반복없이 이러한 목록을 만드는 방법은 없습니다. 루프를 숨기는 방법은 여러 가지가 있지만, [[]] * x처럼 루프를 숨 깁니다. 거기에 루프를 표현식에 "숨 깁니다"(약간은 고맙게도 여전히 분명합니다.) 두 개의 숨겨진 루프 ([[]]에있는 루프가있는 map (list, [[] * x) list ()를 사용하여 각 목록의 사본을 만드는지도에있는 이름입니다.)

    어떤 종류의 반복없이 이러한 목록을 만드는 방법은 없습니다. 루프를 숨기는 방법은 여러 가지가 있지만, [[]] * x처럼 루프를 숨 깁니다. 거기에 루프를 표현식에 "숨 깁니다"(약간은 고맙게도 여전히 분명합니다.) 두 개의 숨겨진 루프 ([[]]에있는 루프가있는 map (list, [[] * x) list ()를 사용하여 각 목록의 사본을 만드는지도에있는 이름입니다.)

    미리 목록을 작성하지 않을 수도 있습니다. 다른 대답은 이미 간단한 접근법을 다루고 있지만, 어떻게 든 여러분의 필요에 맞지 않는다면 다른 방법이 있습니다. 예를 들어, 필요에 따라 빈 목록을 결과 목록에 추가하는 함수를 작성하여 호출 할 수 있습니다.

    def append(L, idx, item):
        while len(L) <= idx:
            L.append([])
        L[idx].append(item)
    
    for i in range(x):
        for j in someListOfElements:
            append(result, i, j)
    

    또는 목록 대신 collections.defaultdict (list)를 사용할 수 있습니다.

    import collections
    result = collections.defaultdict(list)
    for i in range(x):
        for j in someListOfElements:
            result[i].append(j)
    

    그것은 이미 존재하는 타입을 사용하는 것의 이점이 있습니다. 이것은 작업량이 적지 만,리스트 대신에 dict (정수로 인덱스 됨)를 가짐을 의미합니다. 이것은 원하는 것일 수도 아닐 수도 있습니다. 또는 목록과 거의 비슷한 동작을하는 클래스를 만들 수 있지만 IndexError를 발생시키는 대신 자체에 새 목록을 추가합니다. 예를 들면 다음과 같습니다.

    import UserList
    class defaultlist(UserList.UserList):
        def __getitem__(self, idx):
            while len(self) <= idx:
                self.append([])
            return UserList.UserList.__getitem__(self, idx)
    
    result = defaultlist()
    for i in range(x):
        for j in someListOfElements:
            result[i].append(j)
    
  3. ==============================

    3.빠른 생성기 기능을 작성할 수 있습니다. 이것은이 특별한 경우 이외의 다른 용도로 사용되기 때문에 조금 일반화 할 것입니다. 이것을 발굴 :

    빠른 생성기 기능을 작성할 수 있습니다. 이것은이 특별한 경우 이외의 다른 용도로 사용되기 때문에 조금 일반화 할 것입니다. 이것을 발굴 :

    def create(n, constructor=list):
        for _ in xrange(n):
            yield constructor()
    

    그런 다음 목록의 목록을 만들려면,

    result = list(create(10))
    

    빈 dicts의 목록을 만들려면,

    result = list(create(20, dict))
    

    빈 음식 목록을 만들기 위해 (완전성을 위해)

    result = list(create(30, Foo))
    

    물론 위의 튜플을 만들 수도 있습니다. 인수를 생성자에게 허용하기 위해 인수를 확장하는 것은 그리 어렵지 않습니다. 아마도 인덱스를 받아들이고 생성자에 전달할 인수를 반환 한 함수를 수락하게했을 것입니다.

    마지막으로 생각한 것은, 우리가 생성자에 배치하는 유일한 요구 사항은 호출 가능하다는 점 뿐이므로 목록에서 원하는 것을 반환하는 모든 것을 전달할 수도 있다는 것입니다. 예를 들어 데이터베이스 쿼리에서 결과를 가져 오는 바운드 메서드입니다. 아주 유용한 세 줄의 코드입니다.

  4. ==============================

    4.적절한 루프에 목록을 추가하는 것만으로 간단하게 유지하십시오.

    적절한 루프에 목록을 추가하는 것만으로 간단하게 유지하십시오.

    result = []
    for i in range(x):
        result.append([])
        for j in someListOfElements:
            result[i].append(j)
    

    [편집 : 예제 추가]

    >>> someListOfElements = ['a', 'b', 'c']
    >>> x = 3
    >>> result = []
    >>> for i in range(x):
    ...     result.append([])
    ...     for j in someListOfElements:
    ...         result[i].append(j)
    ... 
    >>> 
    >>> result
    [['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]
    
  5. ==============================

    5.실행할 수있는 샘플 코드를 포함시켜주십시오. 코드를 실행하여 원하는 작업을 신속하게 확인할 수 있습니다. 당신이 단지 이것을 원한다고 생각합니다 :

    실행할 수있는 샘플 코드를 포함시켜주십시오. 코드를 실행하여 원하는 작업을 신속하게 확인할 수 있습니다. 당신이 단지 이것을 원한다고 생각합니다 :

    result = []
    for i in range(x):
        data = []
        for j in someListOfElements:
            data.append(j)
        # or data = [j for j in someListOfElements]
        result.append(data)
    
  6. from https://stackoverflow.com/questions/3880037/how-to-create-a-list-or-tuple-of-empty-lists-in-python by cc-by-sa and MIT license