Индекс списка одного значения в целое число в Python? - PullRequest
0 голосов
/ 29 апреля 2018

Можно ли при перечислении превратить один индекс списка значений (например, [5]) в целое число? Я пытаюсь создать программу, которая создает случайное имя пользователя с заданными словами и цифрами, и я хочу удалить слово, если оно уже использовалось ранее:

import random

# data (words/numbers)
words = ['Cool', 'Boring', 'Tall', 'Short']
numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

# words
word_1 = random.choice(words)
selected_word = [i for i,x in enumerate(words) if x == word_1]
words.pop(selected_word)
word_2 = random.choice(words)

# numbers
number_1 = random.choice(numbers)
number_2 = random.choice(numbers)

# printing username
print(word_1+word_2+number_1+number_2)

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Может быть, вы хотели это (не удаляя ни слова)?:

>>> import random
>>> words = ['Cool', 'Boring', 'Tall', 'Short']
>>> numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
>>> selected_word_indices = set()
>>> def select_word():
        if len(selected_word_indices) == len(words):
            raise Exception("No More Unique Word Left")
        while True:
            chosen_index = random.randint(0,len(words)-1)
            if chosen_index not in selected_word_indices:
                chosen = words[chosen_index]
                selected_word_indices.add(chosen_index)
                return chosen

>>> word_1 = select_word()
>>> word_2 = select_word()

>>> number_1 = random.choice(numbers)
>>> number_2 = random.choice(numbers)

>>> print(word_1+word_2+number_1+number_2)

При del выбор будет проще, но потребуется копия words (если вы хотите исходный список, words без изменений):

>>> words_copy = words.copy()
>>> def select_word():
        if len(words_copy) == 0:
            raise Exception("No More Unique Word Left")
        chosen_index = random.randint(0,len(words_copy)-1)
        chosen_word = words_copy[chosen_index]
        del words_copy[chosen_index]
        return chosen_word
0 голосов
/ 29 апреля 2018

Глядя на ваш код ... Я не уверен, что он должен делать, но я могу сделать некоторые предположения.

Сначала вы выбираете случайное слово. Затем вы просматриваете индексы всех слов, которые соответствуют этому слову. Затем вы хотите использовать этот список индексов с pop.

Ну, вы можете исправить это:

for idx in reversed(selected_word):
    words.pop(idx)

(reversed важен, поэтому сначала нужно выбрать самые правые.)

Но в этом нет необходимости, потому что в words должна быть только одна копия word_1 и, следовательно, в selected_word только один индекс. Так что вы можете просто сделать это:

words.pop(selected_word[0])

Но в этом случае понимание не нужно. Получение всех совпадений и получение первого делает то же самое, что и первое совпадение, и списки уже имеют метод для этого: index.

words.pop(words.index(word_1))

Но на самом деле, вместо того, чтобы выбрать слово и затем найти его, чтобы получить индекс, вы можете просто получить индекс:

index = random.randrange(len(words))
word_1 = words.pop(index)

Или, проще всего, просто замените все это на:

word_1, word_2 = random.sample(words, 2)
...