2011-01-26 9 views
3

사전에서 임의 항목을 제거하려면 어떻게합니까?사전에서 임의로 항목 제거

사전에서 지정된 수의 항목을 제거해야하므로 무작위로 생각한 dict.popitem을 사용하려고했지만 그렇지 않은 것으로 보입니다. docs으로

말 :

>>> d = dict(zip((string.ascii_lowercase), range(1, 10))) 
>>> d 
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8} 

지금 내가 (그것에서 일부 항목을 제거 할 수를 필요

내 문제에 대한

Remove and return an arbitrary (key, value) pair from the dictionary.

, 내가 (예를 들어)와 같은 사전이 있다고 가정 사용자가 지정 함).

>>> for _ in range(4):   # assume 4 items have to removed 
...  d.popitem() 
... 
('a', 1) 
('c', 3) 
('b', 2) 
('e', 5) 

그러나이 코드의 문제는, 때마다 스크립트가 실행되어, popitem()정확히 같은 항목 :

그래서 나는 이것을 썼다. 당신은 이것을 시험 할 자유가 있습니다. 이미 여러 번 시도했습니다.

그래서 제 질문은 :

  • 는 왜이 제대로 작동하지 않을 popitem()입니까? 무작위가 아닌 임의의 항목을 제거하고 있습니까?
  • 사전에서 임의 항목을 제거하려면 어떻게해야합니까?
+10

임의! = 임의. –

+1

그럼이 '임의'는 무엇을 기반으로합니까? – user225312

+5

적절하게는 쌍의 내부 순서에 따라 결정됩니다 (반복 순서에도 반영됨 - 다시 말하지만 임의적 인 것은 아닙니다.). Dicts는 순서가 없습니다. 그러나 항목이 내부적으로 저장되는 순서는 결정적입니다. * 일반적으로 생각조차하지 않는 매개 변수를 사용하는 경우 : 키 해시, 삽입 순서, 충돌, 총 항목 수 ... 다시 동일한 방법으로 동일한 사전을 만드는 것은 실제로 동일한 내부 순서를 만듭니다. – delnan

답변

15

이게 당신이 말하는거야?

import random 
for i in range(4): 
    some_dict.pop(random.choice(some_dict.keys())) 
+2

꽤 많이, 비록 내가 이것을 바보짓으로 생각하지 않는다면 :-) – user225312

+18

"지각 적 좁히기"라고합니다. 문제를 해결할 수는 없지만 'popitem'에 대한 모든 것을 이해하기 위해 집중을 좁혔습니다. 일이 열심히 나타날 때, 당신은 아마 그것을 잘못하고 있습니다. 중지. 주위를 둘러보십시오. 차 가져와. 뭔가 더 간단하게 생각하십시오. –

+2

위대한 요점은, 그러나, 나는 "지각 적 협착"을 찾았으며, 유아기에 뇌가 어떻게 발달하는지와 관련이있는 것처럼 보입니다. 조금 더 인터넷 검색 [ "부주의 한 시각 장애"] (http://en.wikipedia.org/wiki/Inattention_blindness) 및 [ "인지 터널링"(http://en.wikipedia.org/wiki/Cognitive_capture)]이 나타났습니다. –

7

popitem()은 임의이지만 임의가 아닙니다. 임의의 요소에 액세스하려면

import random 
key = random.choice(d.keys()) 
val = d[key] 
del d[key] 
+0

! 나를 때려. 오 잘. +1. –

8

"임의"요소를 제거한다는 것은 해당 기능이 좋아하는 항목을 제거 할 수 있음을 의미합니다. 그렇다고해서 그것에 대해 특별히 무작위 적이라는 의미는 아닙니다.

실제 임의성을 위해서는 random 모듈을 사용해야합니다. 예를 들어 :

import random 
for key in random.sample(d.keys(), 4): 
    del d[key] 
+0

나는 이것을 이해하고있는 지금 그것을 얻는 것처럼 보입니다. – user225312

4
  • Why isn't popitem() working the way it should? Is removing arbitrary items not random?

임의 같은 일이 무작위 의미하지 않는다. 임의적으로는 단순히 항목을 반환 할 수 있으며 반환되는 순서에 대해 아무 것도 가정하지 않아야 함을 의미합니다.

  • How do I remove random items from a dictionary?

나는 이것이 최고의 또는 가장 효율적인 방법입니다 주장하지 않습니다,하지만 한 가지 방법은 다음과 같습니다 항목의 지정된 수를 제거하기위한

import random 
dict.pop(random.choice(dict.keys()) 
3

, 나는 대신에 반복 호출을 만드는 random.sample을 사용 dict.keysrandom.choice

for key in random.sample(d.keys(), n): 
    del d[key] # or d.pop(key) 
1
d = {'spam': 0,'url': 'http://www.python.org', 'title': 'Python Web Site'} 
d.popitem() 
print d 

시도의 t 그의 한 내가 {사전에서 임의의 항목} 같은를 달성하기 위해 노력했지만 항상 URL 을 삭제하지만

로 변경하는 경우
d = {'spam': 0,'arl': 'http://www.python.org', 'title': 'Python Web Site'} 
d.popitem() 
print d 

notice: 'u' of url changed to 'a'

제목이 내가 뭔가를 삭제 추측

을 삭제 목록에서 가장 높은 ASCII 값을 가진 항목은 \ 그냥 추측

+0

'popitem'이 내가 찾고 있던 것이 었습니다! – PascalVKooten