source

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

manycodes 2022. 10. 26. 21:12
반응형

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

를 '''에서 수 요?dict한 나라의 수도를 맞혀야 하고 무작위로 나타나려면 질문이 필요한 게임을 만들고 있습니다.

dict가 마치{'VENEZUELA':'CARACAS'}

이거 어떻게 해?

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

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

편집: 질문은 처음 게시한 지 몇 년 후에 바뀌었고, 이제는 하나의 항목이 아닌 쌍을 요구합니다.이제 마지막 줄은 다음과 같습니다.

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

저는 같은 문제를 해결하기 위해 이 글을 썼습니다.

https://github.com/robtandy/randomdict

키, 값 및 항목에 대한 O(1) 랜덤 액세스 권한이 있습니다.

randompopitem()을 사용할 수도 있습니다.

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

★★★★★★★★★★★★★★★★★.dict 순서를 유지하지 않습니다.popitem임의의(엄밀히 랜덤은 아니지만) 순서로 아이템을 얻을 수 있습니다.

'아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.popitem는 문서에서 설명한 바와 같이 키와 값의 쌍을 딕셔너리에서 삭제합니다.

popitem()은 사전을 통해 파괴적으로 반복할 때 유용합니다.

이것을 시험해 보세요.

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

이건 확실히 효과가 있어요.

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

무작위로 전화를 해서.에 대한 선택keys(어느 쪽인가 하면)

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

임의의 키:

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

랜덤값

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

랜덤 키 및 값

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

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

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

(3가지 스타일 포함)

랜덤으로 쓰고 싶지 않다면.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'

이게 숙제니까:

목록에서 임의의 요소를 선택하여 반환하는 것을 확인합니다.사전 키 목록은 다음과 같이 얻을 수 있습니다.dict.keys() 사전 값에는 " "가 포함되어 있습니다.dict.values()

저는 당신이 퀴즈 어플리케이션을 만들고 있다고 생각합니다.이러한 어플리케이션에 대해 다음과 같은 함수를 작성했습니다.

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)을 사용하다

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

옵션을 섞으면 이 기능을 더 확장할 수 있습니다.

Python(에서는 메서드 「Python(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}')

참고 자료:

여기서 랜덤 페어를 요구하는 것은 키와 값을 의미합니다.

key:values는 country:city,

랜덤으로 사용하다선택지

다음과 같이 사전 키를 이 함수에 전달합니다.

import random
keys = list(my_dict)
country = random.choice(keys)

라운드에서 이미 호출된 키를 추적하고 새로운 국가를 가져올 때 추첨된 목록이 키 목록보다 짧으면 랜덤 선택이 이미 그려진 항목 목록에 없을 때까지 루프할 수 있습니다.

우연히 비슷한 문제를 발견하고 다음 솔루션을 설계했습니다(관련 기능은pick_random_item_from_dict; 다른 기능은 완전성을 위한 것입니다.)

import random


def pick_random_key_from_dict(d: dict):
    """Grab a random key from a dictionary."""
    keys = list(d.keys())
    random_key = random.choice(keys)
    return random_key


def pick_random_item_from_dict(d: dict):
    """Grab a random item from a dictionary."""
    random_key = pick_random_key_from_dict(d)
    random_item = random_key, d[random_key]
    return random_item


def pick_random_value_from_dict(d: dict):
    """Grab a random value from a dictionary."""
    _, random_value = pick_random_item_from_dict(d)
    return random_value

# Usage
d = {...}
random_item = pick_random_item_from_dict(d)

이전 답변과의 주요 차이점은 사전 복사본을 처리하는 방법입니다.list(d.items())복사하는 것만으로 부분적으로 피할 수 있습니다.d.keys()랜덤 키를 사용하여 관련 값을 선택하고 랜덤 아이템을 만듭니다.

이것을 사용해 보세요(랜덤 사용).항목에서 선택)

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'

다음은 O(1) 시간 내에 임의의 키를 반환할 수 있는 사전 클래스의 작은 Python 코드입니다.(가독성을 위해 MyPy 타입을 이 코드에 포함시켰습니다).

from typing import TypeVar, Generic, Dict, List
import random

K = TypeVar('K')
V = TypeVar('V')
class IndexableDict(Generic[K, V]):
    def __init__(self) -> None:
        self.keys: List[K] = []
        self.vals: List[V] = []
        self.dict: Dict[K, int] = {}

    def __getitem__(self, key: K) -> V:
        return self.vals[self.dict[key]]

    def __setitem__(self, key: K, val: V) -> None:
        if key in self.dict:
            index = self.dict[key]
            self.vals[index] = val
        else:
            self.dict[key] = len(self.keys)
            self.keys.append(key)
            self.vals.append(val)

    def __contains__(self, key: K) -> bool:
        return key in self.dict

    def __len__(self) -> int:
        return len(self.keys)

    def random_key(self) -> K:
        return self.keys[random.randrange(len(self.keys))]

사전 세트에서 50개의 랜덤 키 값을 선택하려면dict_data:

sample = random.sample(set(dict_data.keys()), 50)

키 범위를 반복할 필요가 있었습니다dict 매번 정렬하지 않고 정렬된 컨테이너 라이브러리를 찾았습니다.이 라이브러리는 인덱스별로 사전 항목에 랜덤으로 액세스할 수 있으므로 매번 반복하지 않고 직관적으로 문제를 해결할 수 있습니다.

>>> import sortedcontainers
>>> import random
>>> d = sortedcontainers.SortedDict({1: 'a', 2: 'b', 3: 'c'})
>>> random.choice(d.items())
(1, 'a')
>>> random.sample(d.keys(), k=2)
[1, 3]

저는 비슷한 해결책을 찾다가 이 게시물을 발견했습니다.딕트에서 여러 요소를 선택할 경우 다음과 같이 사용할 수 있습니다.

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]

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

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

편집: 질문은 처음 게시한 지 몇 년 후에 바뀌었고, 이제는 하나의 항목이 아닌 쌍을 요구합니다.이제 마지막 줄은 다음과 같습니다.

country, capital = random.choice(list(d.items()))
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) 

언급URL : https://stackoverflow.com/questions/4859292/how-to-get-a-random-value-from-dictionary

반응형