파이썬에서 사전에서 임의의 값을 얻는 방법


149

에서 무작위 쌍을 얻으려면 어떻게해야 dict합니까? 나는 당신이 나라의 수도를 추측 해야하는 게임을 만들고 있으며 무작위로 나타나기 위해 질문이 필요합니다.

dict모습처럼{'VENEZUELA':'CARACAS'}

어떻게해야합니까?

답변:


260

한 가지 방법은 다음과 같습니다.

import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
random.choice(list(d.values()))

편집 : 질문은 원래 게시물 이후 몇 년 동안 변경되었으며 이제 단일 항목이 아닌 한 쌍을 요구합니다. 마지막 줄은 이제 다음과 같아야합니다.

country, capital = random.choice(list(d.items()))

141
d.keys()목록이있는 Python 2.x에서는 작동 하지만 d.keys()반복자가 있는 Python 3.x에서는 작동하지 않습니다 . random.choice(list(d.keys()))대신 해야 합니다.
던컨

21
@ Duncan : 모든 타사 라이브러리가 Python 3.x와 호환 될 때까지 기다릴 수 없으므로 Python 질문에는 모든 질문에 대해 2 개의 답변이 필요하지 않습니다.
Gerrat

9
Err 방법은 d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
어떻습니까

4
@gentimouton ... 흥미로운 일이지만 어쩌면 나는 수도가 아닌 각 나라에서 가장 인구가 많은 도시로 가고 있었을 것입니다 :)
Gerrat

12
이것이 효율적입니까? dict이 정말로 커지면이 스케일입니까?
Spectral


14

이 시도:

import random
a = dict(....) # a is some dictionary
random_key = random.sample(a, 1)[0]

이것은 확실히 작동합니다.


12

random모듈 을 사용하지 않으려면 popitem ()을 시도해도됩니다 .

>> d = {'a': 1, 'b': 5, 'c': 7}
>>> d.popitem()
('a', 1)
>>> d
{'c': 7, 'b': 5}
>>> d.popitem()
('c', 7)

dict 는 order을 유지하지 않기 때문에 를 사용 popitem하면 임의의 순서로 항목을 얻습니다 (그러나 엄격하게 무작위는 아님).

또한 docs에popitem 명시된대로 사전에서 키-값 쌍 을 제거합니다 .

popitem ()은 사전을 파괴적으로 반복하는 데 유용합니다


29
같은 버전의 파이썬에서 같은 순서로 사전을로드하면 거의 같은 항목을 얻을 수 있기 때문에 이것은 나쁜 것입니다.
Alex


31
python 3.6 dict은 실제로 주문되었습니다 ! 이것은 매우 중요하다
또는 Duan

7
이 대답은 잘못되었습니다. 3.6 이전에도 이것은 임의의 값을 제공하지 않지만 항목의 해시 값에 따른 값입니다.
OBu

1
OP의 요청과 일치하지 않는 것을 무시하면이 방법은 next사전이므로 매핑과 작동하지 않는 사실을 극복하는 좋은 방법 입니다. (영감을 위해 여기에 왔습니다.
Matteo Ferla

9
>>> import random
>>> d = dict(Venezuela = 1, Spain = 2, USA = 3, Italy = 4)
>>> random.choice(d.keys())
'Venezuela'
>>> random.choice(d.keys())
'USA'

호출하여 random.choice을keys사전 (국가)의.


2
안녕하세요, 귀하의 방법을 사용하여 주어진 사전에서 하나의 키를 무작위로 선택하려고 시도하지만 작동하지 않습니다. 내 사전은 = { 'walk': 20, 'run': 80}처럼 보이고 random.choice (a.keys ())를 사용하면 "dict_keys '개체가 인덱싱을 지원하지 않습니다"와 같은 오류가 있습니다. 무엇이 잘못되었는지 아십니까? 고마워 !!!
beepretty

7
@beepretty dict.keys ()는 목록과 같은 객체가 아닌 반복 가능한 객체를 반환합니다. 오류를 해결하려면을 사용하십시오 random.choice(list(d.keys())).
Greenstick

3
대신 random.sample을 사용하면 키를 목록에 복사하는 것보다 저렴합니다.
steveayre

7

이것은 Python 2와 Python 3에서 작동합니다.

임의의 키 :

random.choice(list(d.keys()))

임의의 값

random.choice(list(d.values()))

임의의 키와 값

random.choice(list(d.items()))

4

random.choice ()를 사용하지 않으려면 다음과 같이 시도하십시오.

>>> list(myDictionary)[i]
'VENEZUELA'
>>> myDictionary = {'VENEZUELA':'CARACAS', 'IRAN' : 'TEHRAN'}
>>> import random
>>> i = random.randint(0, len(myDictionary) - 1)
>>> myDictionary[list(myDictionary)[i]]
'TEHRAN'
>>> list(myDictionary)[i]
'IRAN'

주의 : list(…)여기에 여러 번 생성합니다 . 어때요 myDictionary_list = list(myDictionary)?
Cadoiz

4

원래 게시물이 쌍을 원했기 때문에 :

import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}
country, capital = random.choice(list(d.items()))

(파이썬 3 스타일)


3

이것은 숙제이기 때문에 :

확인 random.sample()선택하고 목록에서 임의의 요소를 반환한다. 을 사용하여 사전 키 목록과을 사용하여 dict.keys()사전 값 목록을 얻을 수 있습니다 dict.values().


5
random.samplerandom.choice반복자 작동하지 않을 수 있습니다. 시퀀스의 길이를 알아야하며, 이터레이터에서 결정할 수 없습니다.
AFoglia

10
아니오 이것은 숙제가 아닙니다. 스페인어로 나를 돕기 위해 쓰고 있습니다.
tekknolagi

3
random.sample반환 k임의 요소 , random.choice반환 하나의 랜덤 요소
Anentropic

네 ... 숙제 문제라고 생각하지 마십시오. 그것이 지역 사회를 위해 무엇을 말하는가?
jvriesem

3

나는 당신이 퀴즈 종류의 응용 프로그램을 만들고 있다고 가정합니다. 이러한 종류의 응용 프로그램을 위해 다음과 같은 함수를 작성했습니다.

def shuffle(q):
"""
The input of the function will 
be the dictionary of the question
and answers. The output will
be a random question with answer
"""
selected_keys = []
i = 0
while i < len(q):
    current_selection = random.choice(q.keys())
    if current_selection not in selected_keys:
        selected_keys.append(current_selection)
        i = i+1
        print(current_selection+'? '+str(q[current_selection]))

입력을 questions = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}하고 함수를 호출하면shuffle(questions) 하면 출력은 다음과 같습니다.

베네수엘라? 카라카스
캐나다? 토론토

옵션을 섞으면 서 더 확장 할 수 있습니다


이와 같은 교체없이 도면을 프로그래밍해서는 안됩니다. 100 개의 요소 중 100 번째를 그리는 것을 상상해보십시오. 99 %의 확률로 안에있는 요소를 칠 수 selected_keys있습니다. 그리고 당신은 그것을 약 100 번 반복 할 것입니다. 적어도 q와 같이 가져온 키를 삭제하십시오 del(q[current_selection])- 모든 selected_keys것과 마찬가지로 셔플 된 새로운 것으로 q를 덮어 쓸 수 있습니다 q = selected_keys. 또한 식별을 잊지 마십시오! 또는 내 np.random.choice(...)접근 방식을 살펴보십시오 . stackoverflow.com/a/62843377/4575793
Cadoiz

1

이것을 시도하십시오 (항목에서 random.choice 사용)

import random

a={ "str" : "sda" , "number" : 123, 55 : "num"}
random.choice(list(a.items()))
#  ('str', 'sda')
random.choice(list(a.items()))[1] # getting a value
#  'num'

1

(3부터) 파이썬의 현대 버전으로,이 방법에 의해 반환 된 객체 dict.keys(), dict.values()그리고 dict.items()*보기 개체입니다. 그리고 반복 할 수 있으므로 random.choice목록이나 세트가 아니므로 직접 사용할 수 없습니다.

한 가지 옵션은 목록 이해를 사용하여 다음 작업을 수행하는 것입니다 random.choice.

import random

colors = {
    'purple': '#7A4198',
    'turquoise':'#9ACBC9',
    'orange': '#EF5C35',
    'blue': '#19457D',
    'green': '#5AF9B5',
    'red': ' #E04160',
    'yellow': '#F9F985'
}

color=random.choice([hex_color for color_value in colors.values()]

print(f'The new color is: {color}')

참고 문헌 :


0
b = { 'video':0, 'music':23,"picture":12 } 
random.choice(tuple(b.items())) ('music', 23) 
random.choice(tuple(b.items())) ('music', 23) 
random.choice(tuple(b.items())) ('picture', 12) 
random.choice(tuple(b.items())) ('video', 0) 

2
스택 오버플로에 오신 것을 환영합니다! 이 코드 스 니펫에 대해 약간의 단기적인 도움을 제공 할 수 있습니다. 적절한 설명 이것이 문제에 대한 좋은 해결책 인지 보여줌으로써 장기적인 가치를 크게 향상시킬 것이며, 다른 비슷한 질문을 가진 미래 독자들에게 더 유용 할 것입니다. 제발 편집 당신이 만든 가정 등 일부 설명을 추가 할 답변을.
Toby Speight

0

나는 다소 비슷한 해결책을 찾아서이 게시물을 찾았습니다. dict에서 여러 요소를 선택하려면 다음을 사용할 수 있습니다.

idx_picks = np.random.choice(len(d), num_of_picks, replace=False) #(Don't pick the same element twice)
result = dict ()
c_keys = [d.keys()] #not so efficient - unfortunately .keys() returns a non-indexable object because dicts are unordered
for i in idx_picks:
    result[c_keys[i]] = d[i]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.