1

オンラインで2 つのリストを比較し、#12見つかった一致を返そうとしています。

リストには、ユーザーが選択unした 1 つの番号 ( ) と、そのうちの 1 つがランダムに生成されたもの( ) が含まれていrnます。

たとえば、[['1', '5', '3', '7']]and[['9', '6', '3', '2']]は を返し[3]ます。

私はPythonにかなり慣れていないため、 HEREにあるソリューションを使用していましたが、コードでまだ成功していません。

import random
import re

rn = []
un = []

Numbers = range(1000,9999)
RandomNumber = random.choice(Numbers)
RandomNumber = str(RandomNumber)

def check():
    x = set(rn) & set(un) #12
    print (x)

def numsys():
    b = list(RandomNumber)
    rn.append(b)
    print(rn)
    print(un)
    check()


def numval():
    while True:
        UserNum = (input("Please enter a 4 digit number: "))
        if re.match("^[0-9]{4,4}$", UserNum):
            a = list(UserNum)
            un.append(a)
            numsys()
            break        
numval()
4

2 に答える 2

1

リストを使用してデータを渡すのではなく、関数パラメーターを使用します。

import random
import re

def check(random_number, user_number):
    print('random_number {}, user_number {}'.format(random_number, user_number))
    x = set(random_number).intersection(user_number)
    print(x)

def numval():
    random_num = str(random.choice(range(1000, 9999)))
    while True:
        user_num = (input("Please enter a 4 digit number: "))
        if re.match("^[0-9]{4,4}$", user_num):
            check(random_num, user_num)
            break

numval()

これにより、関数内のグローバル変数へのアクセスが回避され、一般的に読みやすくなります。numsys()これを行うと、 function で値にアクセスできるようにするためにグローバル変数を不必要にいじるだけだったので、function を削除できましたcheck()

単純化の 1 つは、乱数とユーザー番号を文字列として保持することでした。set()最初にリストに変換する必要なく、文字列に対して呼び出すことができます。また、演算子set.intersection()の代わりに使用する場合は、文字列の 1 つだけを明示的にセットに変換する必要があります。&

また、 PEP8 スタイル ガイドに準拠するように変数の名前を自由に変更しました。

于 2016-09-09T13:40:44.583 に答える
1

リストを文字列に前後にキャストすると、結果は元の文字列にはなりません。元の文字列の表現の文字を含むリストになります。

>>> a = [1, 2, 3]
>>> b = str(a)
>>> c = list(b)
>>> c
['[', '1', ',', ' ', '2', ',', ' ', '3', ']']

そのようなキャストを行わないでください。必要な場合は、','.join(map(str, a))文字列にlist(map(int, b.split(',')))キャストし、リストにキャストするために使用してください。

于 2016-09-09T13:18:54.317 に答える