programing

Python : dict(존재하는 경우) 목록. 새로운 dict를 추가하지 않으면 dict 값을 증가시킵니다.

padding 2023. 4. 18. 21:49
반응형

Python : dict(존재하는 경우) 목록. 새로운 dict를 추가하지 않으면 dict 값을 증가시킵니다.

저도 그런 걸 하고 싶어요.

list_of_urls = ['http://www.google.fr/', 'http://www.google.fr/', 
                'http://www.google.cn/', 'http://www.google.com/', 
                'http://www.google.fr/', 'http://www.google.fr/', 
                'http://www.google.fr/', 'http://www.google.com/', 
                'http://www.google.fr/', 'http://www.google.com/', 
                'http://www.google.cn/']

urls = [{'url': 'http://www.google.fr/', 'nbr': 1}]

for url in list_of_urls:
    if url in [f['url'] for f in urls]:
         urls[??]['nbr'] += 1
    else:
         urls.append({'url': url, 'nbr': 1})

어떻게 해야 하나요? 편집하기 위해 태플을 사용해야 할지 아니면 태플 인덱스를 찾아야 할지 모르겠어요.

도움이 필요하신가요?

그것은 매우 이상한 정리법이다.사전에 보존한 경우는, 다음과 같이 간단하게 할 수 있습니다.

# This example should work in any version of Python.
# urls_d will contain URL keys, with counts as values, like: {'http://www.google.fr/' : 1 }
urls_d = {}
for url in list_of_urls:
    if not url in urls_d:
        urls_d[url] = 1
    else:
        urls_d[url] += 1

카운트 사전을 업데이트하기 위한 이 코드는 Python에서 일반적인 "패턴"입니다.그것은 매우 일반적이기 때문에 특별한 데이터 구조가 있다.defaultdict보다 간단하게 하기 위해서 작성되었습니다.

from collections import defaultdict  # available in Python 2.5 and newer

urls_d = defaultdict(int)
for url in list_of_urls:
    urls_d[url] += 1

에 액세스 하는 경우defaultdict키를 사용하고 있으며, 키는 아직 에 존재하지 않습니다.defaultdict키는 기본값으로 자동으로 추가됩니다.defaultdict는, 전달한 콜 가능을 취득해, 디폴트치를 취득하기 위해서 콜 합니다.이 경우, 우리는 수업 시간에 합격했다.int; Python이 호출할 때int()0 값을 반환합니다.따라서 URL을 처음 참조할 때 URL의 카운트는 0으로 초기화된 후 카운트에 1을 추가합니다.

그러나 카운트로 가득 찬 사전도 일반적인 패턴이기 때문에 Python은 즉시 사용할 수 있는 클래스를 제공합니다.containers.Counter작성만 하면 됩니다.Counter예를 들어, 클래스를 호출하여 반복할 수 있습니다. 사전은 키가 반복할 수 있는 값이고 값이 반복할 수 있는 키에 나타난 횟수를 카운트하는 것입니다.위의 예는 다음과 같습니다.

from collections import Counter  # available in Python 2.7 and newer

urls_d = Counter(list_of_urls)

표시된 방법으로 작업을 수행해야 하는 경우, 가장 쉽고 빠른 방법은 이 세 가지 예 중 하나를 사용하여 필요한 예를 작성하는 것입니다.

from collections import defaultdict  # available in Python 2.5 and newer

urls_d = defaultdict(int)
for url in list_of_urls:
    urls_d[url] += 1

urls = [{"url": key, "nbr": value} for key, value in urls_d.items()]

Python 2.7 이후를 사용하고 있는 경우는, 원라이너로 실행할 수 있습니다.

from collections import Counter

urls = [{"url": key, "nbr": value} for key, value in Counter(list_of_urls).items()]

디폴트를 사용하면 동작하지만, 다음과 같이 동작합니다.

urls[url] = urls.get(url, 0) + 1

사용..get디폴트 반환이 존재하지 않는 경우는, 디폴트 반환을 취득할 수 있습니다.디폴트로는 [None]이지만, 보내드린 경우는 0이 됩니다.

defaultdict 사용:

from collections import defaultdict

urls = defaultdict(int)

for url in list_of_urls:
    urls[url] += 1

이 방법은 항상 잘 작동합니다.

for url in list_of_urls:
    urls.setdefault(url, 0)
    urls[url] += 1

처음 단어를 볼 때마다 if 문의 테스트가 실패합니다.단어를 많이 셀 경우 여러 번 발생할 수 있습니다.값의 초기화가 1회만 발생하고 그 값의 증대가 여러 번 발생하는 상황에서는 try 문을 사용하는 것이 저렴합니다.

urls_d = {}
for url in list_of_urls:
    try:
        urls_d[url] += 1
    except KeyError:
        urls_d[url] = 1

자세한 것은, https://wiki.python.org/moin/PythonSpeed/PerformanceTips 를 참조해 주세요.

정확히 당신 방식대로 하려고요?당신은 ...엘스 구조를 사용할 수 있습니다.

for url in list_of_urls:
    for url_dict in urls:
        if url_dict['url'] == url:
            url_dict['nbr'] += 1
            break
    else:
        urls.append(dict(url=url, nbr=1))

하지만 그것은 꽤 우아하지 않다.방문한 URL을 목록으로 저장해야 합니까?예를 들어 URL 문자열별로 색인화된 dict로 정렬하면 훨씬 깔끔해집니다.

urls = {'http://www.google.fr/': dict(url='http://www.google.fr/', nbr=1)}

for url in list_of_urls:
    if url in urls:
        urls[url]['nbr'] += 1
    else:
        urls[url] = dict(url=url, nbr=1)

두 번째 예에서 주의해야 할 점은 다음과 같습니다.

  • urls를 통해 전체를 .urls의 싱글 「」의 합니다.url이 접근방식은 더 빠릅니다.
  • 「」를 사용합니다.dict( ) 대신 를 짧게 .
  • 를 사용합니다.list_of_urls,urls ★★★★★★★★★★★★★★★★★」url변수 이름이 코드를 해석하기 어렵기 때문입니다., 보다, 보다, 보다, 보다, 명료한 것을 이 좋습니다urls_to_visit,urls_already_visited ★★★★★★★★★★★★★★★★★」current_url하지만 더 명확해.

물론 저는 라고 가정합니다.dict(url='http://www.google.fr', nbr=1)는, 의 데이터 그렇지 않으면, 「의 데이터 구조가 됩니다.그렇지 않으면urls하다

urls = {'http://www.google.fr':1}

for url in list_of_urls:
    if url in urls:
        urls[url] += 1
    else:
        urls[url] = 1

defaultdict 스탠스를 사용하면 매우 우아해질 수 있습니다.

urls = collections.defaultdict(int)
for url in list_of_urls:
    urls[url] += 1

언급URL : https://stackoverflow.com/questions/1692388/python-list-of-dict-if-exists-increment-a-dict-value-if-not-append-a-new-dic

반응형