将变量设置为数组中的随机元素,而不是元素值。 - -蟒蛇 - -

时间:2016-05-27 15:09:17

标签: python arrays variable-names

这是一个基于文本的纸牌游戏。

我一直试图让python从数组中随机选择一个变量,并将变量的名称存储在Fa中。但是它只存储变量Fa的值而不存储变量的名称。

我的代码:

 import random

 k='King'
 q='Queen'
 j='Jack'
 t='Ten'
 n='Nine'
 e='Eight'
 s='Seven'
 i='Six'
 f='Five'
 u='Four'
 h='Three'
 w='two'
 a='ace'
 c='of clubs'
 d='of diamonds'
 p='of spades'
 r='of hearts'
 #clubs
 A1=k+' '+c
 B1=q+' '+c
 C1=j+' '+c
 D1=t+' '+c
 E1=n+' '+c
 F1=e+' '+c
 G1=s+' '+c
 H1=i+' '+c
 I1=f+' '+c
 J1=u+' '+c
 K1=h+' '+c
 L1=w+' '+c
 M1=a+' '+c
 #diamonds
 A2=k+' '+d
 B2=q+' '+d
 C2=j+' '+d
 D2=t+' '+d
 E2=n+' '+d
 F2=e+' '+d
 G2=s+' '+d
 H2=i+' '+d
 I2=f+' '+d
 J2=u+' '+d
 K2=h+' '+d
 L2=w+' '+d
 M2=a+' '+d
 #spades
 A3=k+' '+p
 B3=q+' '+p
 C3=j+' '+p
 D3=t+' '+p
 E3=n+' '+p
 F3=e+' '+p
 G3=s+' '+p
 H3=i+' '+p
 I3=f+' '+p
 J3=u+' '+p
 K3=h+' '+p
 L3=w+' '+p
 M3=a+' '+p
 #hearts
 A=k+' '+r
 B=q+' '+r
 C=j+' '+r
 D=t+' '+r
 E=n+' '+r
 F=e+' '+r
 G=s+' '+r
 H=i+' '+r
 I=f+' '+r
 J=u+' '+r
 K=h+' '+r
 L=w+' '+r
 M=a+' '+r

 clubs=[A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1]
 diamonds=[A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2,L2,M2]
 hearts=[A3,B3,C3,D3,E3,F3,G3,H3,I3,J3,K3,L3,M3]
 spades=[A,B,C,D,E,F,G,H,I,J,K,L,M]

 CardTotal=len(clubs)

 X=''
 Da=''
 Fa=''
 sep='\n And \n'
 hand=''

 Cardhand=7

 while(Cardhand != 0):
    Cardhand=Cardhand-1
    Da=random.choice(['1', '2', '3','4'])
    if(Da=='1'):
        Fa=random.choice(clubs)
    elif(Da=='2'):
        Fa=random.choice(hearts)
    elif(Da=='3'):
        Fa=random.choice(spades)
    elif(Da=='4'):
        Fa=random.choice(diamonds)

    hand=hand+sep+Fa+sep

    if(Fa in clubs):
        clubs.pop(Fa)
    elif(Fa in diamonds):
        diamonds.pop(Fa)
    elif(Fa in hearts):
        hearts.pop(Fa)
    elif(Fa in spades):
       spades.pop(Fa)

    Da=''
    Fa=''


 cards=[clubs,diamonds,hearts,spades]    

3 个答案:

答案 0 :(得分:0)

问题在于您的数据结构: clubs=[A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1]只会在数组中包含变量的值。如果您还想拥有变量名称,我建议将其更改为dict并将key作为变量名称。例如:

clubs = {
  'A1': A1,
  'B1': B1,
  'C1': C1,
  'D1': D1,
  'E1': E1,
  'F1': F1,
  'G1': G1,
  'H1': H1,
  'I1': I1,
  'J1': J1,
  'K1': K1,
  'L1': L1,
  'M1': M1
}

编辑:(正如Ishaq Khan所建议的,对于python3 clubs.keys(),返回一个不可迭代的dict_keys对象 然后random.choice(clubs)会更改为random.choice(list(clubs.keys()))

答案 1 :(得分:0)

如果我清楚地理解,那就使用字典。

从我的示例中复制代码:

import random

dic = {'k' : 'king', 'q' : 'queen'}

dic_keys = list(dic.keys())

which = random.choice(dic_keys)

selected_v = which
selected_v_v = dic[selected_v]

print(selected_v, selected_v_v)

答案 2 :(得分:0)

您需要意识到创建列表时python不会传递“变量名称”。

通过做:

spades=[A,B,C,D,E,F,G,H,I,J,K,L,M]

列表只包含那些变量指向的值,只需打印出列表即可看到:

>>> spades
['King of hearts', 'Queen of hearts', 'Jack of hearts', 'Ten of hearts', 'Nine of hearts', 'Eight of hearts', 'Seven of hearts', 'Six of hearts', 'Five of hearts', 'Four of hearts', 'Three of hearts', 'two of hearts', 'ace of hearts']

如果您想获取变量名称,可以将它们存储为不带值的字符串:

spades=['A','B','C','D','E','F','G','H','I','J','K','L','M']

或具有名称和值的元组列表:

spades=[('A',A),('B',B),('C',C),('D',D),('E',E),('F',F),('G',G),('H',H),('I',I),('J',J),('K',K),('L',L),('M',M)]

然后可以使用以下内容提取值和名称:

name, value = Fa

虽然这实际上更适合映射,但不是索引检索的元素列表,而是将每个值与名称相关联:

spades = {'A':A, 'B':B, 'C':C, 'D':D, 'E':E, 'F':F, 'G':G, 'H':H, 'I':I, 'J':J, 'K':K, 'L':L, 'M':M}

虽然这会阻止random.choice工作,但您必须将其更改为:

Fa=random.choice(tuple(spades))

由于random.choice依赖于使用索引来选择随机元素,因此需要序列才能正常工作

然后,您可以通过捕获.pop的返回值

来获取卡片的文本
card_text = spades.pop(Fa)

您可能不喜欢传递变量值而不是变量名称的想法,但您会意识到它可以大大简化代码,例如而不是:

Da=random.choice(['1', '2', '3','4'])
if(Da=='1'):
    Fa=random.choice(clubs)
elif(Da=='2'):
    Fa=random.choice(hearts)
elif(Da=='3'):
    Fa=random.choice(spades)
elif(Da=='4'):
    Fa=random.choice(diamonds)

您可以选择其中一个列表/词组,如下所示:

Da=random.choice([clubs,diamonds,hearts,spades])
#Da is now the dict for the selected suit
Fa = random.choice(tuple(Da))

然后整个while循环可能就是这样:

spades   = { 'A': A,  'B': B,  'C': C,  'D': D,  'E': E,  'F': F,  'G': G,  'H': H,  'I': I,  'J': J,  'K': K,  'L': L,  'M': M}
clubs    = {'A1':A1, 'B1':B1, 'C1':C1, 'D1':D1, 'E1':E1, 'F1':F1, 'G1':G1, 'H1':H1, 'I1':I1, 'J1':J1, 'K1':K1, 'L1':L1, 'M1':M1}
diamonds = {'A2':A2, 'B2':B2, 'C2':C2, 'D2':D2, 'E2':E2, 'F2':F2, 'G2':G2, 'H2':H2, 'I2':I2, 'J2':J2, 'K2':K2, 'L2':L2, 'M2':M2}
hearts   = {'A3':A3, 'B3':B3, 'C3':C3, 'D3':D3, 'E3':E3, 'F3':F3, 'G3':G3, 'H3':H3, 'I3':I3, 'J3':J3, 'K3':K3, 'L3':L3, 'M3':M3}
while(Cardhand != 0):
    Cardhand=Cardhand-1
    Da=random.choice([clubs,diamonds,hearts,spades])
    #Da is now the dict for the selected suit
    Fa = random.choice(tuple(Da))
    #Fa is the key in that dict, so A or B2 or similar
    card_text = Da.pop(Fa)
    hand=hand+sep+card_text+sep