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
'programing' 카테고리의 다른 글
문자열을 셀의 날짜로 변환 (0) | 2023.04.18 |
---|---|
Windows에서 Python에서 Excel 구동 (0) | 2023.04.18 |
정적 클래스 속성에 바인딩하고 있습니다. (0) | 2023.04.18 |
bash에 변수가 있는 별칭 (0) | 2023.04.18 |
bash에 파일이 있는지 테스트하기 위해 루프하는 동안 (0) | 2023.04.18 |