Python 检查列表中的某些元素是否相同
因此,我已经在这个问题上坐了一段时间,在搜索了多个其他问题后,找不到我需要的答案 我已经设置了一个任务,使一个4位随机数发生器,然后用户必须尝试和猜测的数字。他们每试一次,都会说他们有多少数字是正确的,他们处于什么位置。 此外,号码需要位于正确的位置 这是我当前的代码Python 检查列表中的某些元素是否相同,python,python-3.x,Python,Python 3.x,因此,我已经在这个问题上坐了一段时间,在搜索了多个其他问题后,找不到我需要的答案 我已经设置了一个任务,使一个4位随机数发生器,然后用户必须尝试和猜测的数字。他们每试一次,都会说他们有多少数字是正确的,他们处于什么位置。 此外,号码需要位于正确的位置 这是我当前的代码 import random as r def GetNumber(): number = [r.randint(0, 9), r.randint(0, 9), r.randint(0, 9), r.randint(0, 9
import random as r
def GetNumber():
number = [r.randint(0, 9), r.randint(0, 9), r.randint(0, 9), r.randint(0, 9)]
return number
def Choices():
randomNumber = GetNumber()
userChoice = list(input("Enter 4 numbers\n")) #Allows the user to input a number 4 digits long
userChoice = [int(i) for i in userChoice]
if userChoice == randomNumber:
print("Congratulations! You chose the right number")
提前感谢:)您可以选择随机数和用户的选择,并比较配对:
>>> number = [4, 3, 9, 1]
>>> choice = [1, 3, 4, 1]
>>> [n == c for n, c in zip(number, choice)]
[False, True, False, True]
>>> sum(n == c for n, c in zip(number, choice))
2
要获得匹配号码的总数,无论其位置如何,您都可以通过a输入号码和用户的选择,并获得它们与&
的交点:
>>> from collections import Counter
>>> Counter(number) & Counter(choice)
Counter({1: 1, 3: 1, 4: 1})
>>> sum((Counter(number) & Counter(choice)).values())
3
这是我的看法
import random as r
def GetNumber():
return [r.randint(0, 9) for i in range(4)]
def Choices():
randomNumber = GetNumber()
userChoice = [int(i) for i in list(input("Enter 4 numbers\n"))]
n = 0
while userChoice != randomNumber:
hits = [str(i+1) for i in range(4) if userChoice[i] == randomNumber[i]]
if hits:
print('You got position(s) {} correct'.format(', '.join(hits)))
else:
print('You got all of them wrong!')
userChoice = [int(i) for i in list(input("Enter 4 numbers\n"))]
n += 1
print("Congratulations! You found the right number in {} turns!!".format(n))
Choices()
代码被重新构造成循环,直到用户真正找到密码为止。这只是一个框架,您可以在此基础上进行一些实验,并尝试在用户交互或其他方面进一步优化它
如果有什么不清楚的地方,请告诉我。干杯 我认为解决这个问题的关键是使用一串数字,而不是数字数据类型。这里有一个有效的例子。您可以通过比较数字来实现这一点,但在本例中,我们不太关心数值,而是关心字符的模式
from random import choice
from string import digits
def is_digits(string):
"""Return true if all characters are digits, otherwise false"""
return all([char.isdigit() for char in string])
def get_number(length):
"""Return a string of digits with the number of characters equal to length"""
return ''.join(choice(digits) for i in range(length))
def guess():
"""Receive and evaluate guesses for match to randomly generated number"""
guess = ''
miss_char = '-'
miss_message = 'Try again.'
win_message = 'Congratulations! You chose the right number.'
answer_length = 4
answer = get_number(answer_length)
while guess != answer:
guess = raw_input('Enter {0} numbers: '.format(len(answer)))
if len(guess) != len(answer) or is_digits(guess) is False:
continue
matches = [answer[i]
if answer[i] == guess[i]
else miss_char
for i in range(len(answer))]
matches_string = ''.join(matches)
message_base = 'Matched digits: {0}.'.format(matches_string)
if guess != answer:
print(' '.join([message_base, miss_message]))
guess = ''
else:
print(' '.join([message_base, win_message]))
guess()
如果你想要一个4位数的随机数,为什么不
r.randint(10009999)
呢?所以你正在尝试编写智囊团游戏的代码。。到目前为止,您的代码非常好。你也可以一个人做这件事。@Chris_Rands我也想有机会成为第一个数字0@Ev.Kounis我正在制作智囊团游戏,但是我的大部分代码都非常低效,我想让它尽可能的高效possible@Jake啊,我看到使用[r.randint(0,9)表示范围(4)中的I]
然后感谢您的快速回复,对它进行了一次测试,结果很好perfectly@Tobias_k他的回答也很有趣。您可能希望将这两者融合在一起,以提示用户在错误的位置上输入正确的数字,或者soWell,它不符合问题的要求,它是一个没有任何解释的纯代码答案,在Python 3中无法正常工作,并且它会无缘无故地创建一个单元素列表。@interjay thx,我修复了这个问题,但我一直在关注这个问题并解决当前的问题,我的意思是这不是代码审查,你在这里发布的代码应该是好代码,因为这是人们学习的内容。无论如何,您已经解决了我列出的一个问题,但这仍然不能满足问题的要求(检查哪些数字是正确的)。thx@interjay,已修复,仍然不适用于Python3(输入和原始输入)sum(n==c代表n,zip中的c(数字,选项))
返回2非常漂亮
from random import choice
from string import digits
def is_digits(string):
"""Return true if all characters are digits, otherwise false"""
return all([char.isdigit() for char in string])
def get_number(length):
"""Return a string of digits with the number of characters equal to length"""
return ''.join(choice(digits) for i in range(length))
def guess():
"""Receive and evaluate guesses for match to randomly generated number"""
guess = ''
miss_char = '-'
miss_message = 'Try again.'
win_message = 'Congratulations! You chose the right number.'
answer_length = 4
answer = get_number(answer_length)
while guess != answer:
guess = raw_input('Enter {0} numbers: '.format(len(answer)))
if len(guess) != len(answer) or is_digits(guess) is False:
continue
matches = [answer[i]
if answer[i] == guess[i]
else miss_char
for i in range(len(answer))]
matches_string = ''.join(matches)
message_base = 'Matched digits: {0}.'.format(matches_string)
if guess != answer:
print(' '.join([message_base, miss_message]))
guess = ''
else:
print(' '.join([message_base, win_message]))
guess()