Как сравнить два списка и вернуть список с элементами, которые имеют один и тот же индекс? - PullRequest
0 голосов
/ 03 ноября 2019

Мне нужно взять пользовательский ввод из 4 цифр, сравнить его со случайно сгенерированным 4-значным числом, а затем вернуть общие для них значения в тех же индексах.

Так, например: Секретный номер: 4667

Ввод пользователя: 3608

Вывод: _ 6 _ _

К сожалению, когда я запускаю то, что уже написал, он печатает цифры в любом положении, в котором ониВы вводите секретный номер независимо от его позиции в пользовательском вводе, а затем он также возвращает число «_» для каждой итерации в цикле for.

Вот что у меня есть до сих пор:

from random import randint

def randomNumber():
    numberList = []
    digits = 0
    while digits != 4:
        numberList += [randint(0,9)]
        digits += 1
    return numberList

secretNumber = randomNumber()

guessNumber = list(input("Enter a four digit number: "))

guessNumber = list(map(int, guessNumber))

guessList = guessNumber.copy()
correctNumbers = []
numberPosition = []
numberPosition.clear()
for number in guessNumber:
    if number in secretNumber:
        correctNumbers.append(number)
        for n in secretNumber:
            if n == number:
                numberPosition.append(n)
            else:
                numberPosition.append("_")

Я извиняюсь, если есть какие-либо проблемы с пробелами / табуляции в этом блоке кода, я скопировал его из блокнота Jupyter.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 03 ноября 2019

Я думаю, что логика итерации несколько неверна. Рассматривая пример -

In [10]: secretNumber = [4,6,6,7]

In [11]: guessNumber = [3,6,0,8]

In [12]: for i in range(len(secretNumber)):
    ...:     if secretNumber[i] == guessNumber[i]:
    ...:         numberPositions.append(secretNumber[i])
    ...:     else:
    ...:         numberPositions.append("_")
    ...:

In [13]: numberPositions
Out[13]: ['_', 6, '_', '_']

В основном вам нужно выполнить итерацию только один раз для длины любого из списков (в данном случае 4) и обновить переменную numberPositions.

Вот один изприведенный выше код, если вы заинтересованы -

In [12]: "".join([str(secretNumber[i]) if secretNumber[i] == guessNumber[i] else "_" for i in range(len(secretNumber))])
Out[12]: '_6__'

0 голосов
/ 03 ноября 2019

Этот однострочный код сделает это:

In [1]: ''.join(a if a==b else '_' for a, b in zip(secretNumber,guessNumber))
Out[1]: '_6__'
0 голосов
/ 03 ноября 2019

попробуйте это:

def f(a, b):
    for i in range(min(len(a), len(b))):
        if a[i] == b[i]:
            yield i, a[i]
        else:
            yield i, None

a, b = '123456', '2335678'
print(''.join(['_' if c is None else c for _, c in f(a, b)]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...