'tuple'没有属性'pop'

时间:2019-02-08 10:43:37

标签: python arrays pop

我正在尝试获取此代码以从此“纸牌”中选择一个随机值,删除所选的“纸牌”,然后将其附加到used_deck

deck = [('ad','ah','ac','as'),('2d','2h','2c','2s'),('3d','3h','3c','3s'),('4d','4h','4c','4s'),('5d','5h','5c','5s'),('6d','6h','6c','6s'),('7d','7h','7c','7s'),('8d','8h','8c','8s'),('9d','9h','9c','9s'),('td','th','tc','ts'),('jd','jh','jc','js'),('qd','qh','qc','qs'),('kd','kh','kc','ks')]
used_deck=[]

a = random.randint(0,len(deck))
try:
    b = random.randint(0,3)
    card = [a][b]
except:
    try:
        b = random.randint(0,2)
    except:
        try:
            b = random.randint(0,1)
        except:
            b = 0

print(deck[a][b],'\n')
user_deck.append(deck[a][b])
print(user_deck)
deck[a].pop(b)
print(deck)

但是在运行此代码时出现错误:

deck[a].pop(b)
AttributeError: 'tuple' object has no attribute 'pop'

我是否假定无法使用.pop来使用它,但我浏览过的所有网站都以与我相同的方式使用它?

6 个答案:

答案 0 :(得分:2)

您正在使用元组,那些是不可变的,为什么不使用列表?

deck = [['ad','ah','ac','as']

代替

 [('ad','ah','ac','as')

答案 1 :(得分:2)

组是不可变的,这意味着它们在创建后就无法更改。您可以从这里https://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences了解更多有关它们的信息。

如果要修改某些内容中的数据,则应将其包含在可变数据结构中。在这种情况下,列表可以正常工作。

以下是您如何执行此操作的示例:

import random


deck = [['ad', 'ah', 'ac', 'as'], ['2d', '2h', '2c', '2s'], ['3d', '3h', '3c', '3s'], ['4d', '4h', '4c', '4s'], ['5d', '5h', '5c', '5s'], ['6d', '6h', '6c', '6s'], ['7d', '7h', '7c', '7s'], ['8d', '8h', '8c', '8s'], ['9d', '9h', '9c', '9s'], ['td', 'th', 'tc', 'ts'], ['jd', 'jh', 'jc', 'js'], ['qd', 'qh', 'qc', 'qs'], ['kd', 'kh', 'kc', 'ks']]

used_deck = []

card_type = random.choice(deck)
card = random.choice(card_type)
card_type.remove(card)
used_deck.append(card)

print('Card: {}'.format(card))
print('Used deck: {}'.format(used_deck))
print('Deck: {}'.format(deck))

答案 2 :(得分:1)

deck_list = list(deck)   # Convert to list
deck_list.pop(a)

print(deck_list)
deck = tuple(deck_list)  # Convert back to tuple

答案 3 :(得分:1)

元组是所谓的不可变对象。 关于不可变序列 from the docs

  

不可变序列

     

一个不变序列类型的对象一旦创建就无法更改。 (如果对象包含对其他对象的引用,则这些其他对象可能是可变的,并且可能会更改;但是,不可变对象直接引用的对象的集合不能更改。)

您可以将元组更改为列表:

a = (1, 2, 3)
a = list(a)
a.pop(0)

,或遍历元组:

a = (1,2,3)
a = [ i for (idx, i) in enumerate(a) if idx != 0 ]

可能还有其他方法。

答案 4 :(得分:0)

  

甲板[a] .pop(b)

     

AttributeError:“元组”对象没有属性“ pop”

a是一个整数,所以deck[a]是列表deck中的一项,它给出了一个元组。也就是说,deck[a]是一个元组,它没有pop属性/方法。

deck.pop(a)

将从名为a的列表中删除索引为deck的项(元组)。

答案 5 :(得分:0)

如果您知道索引,则也可以使用此:

def tuple_pop(t: tuple, idx: int) -> tuple:
    return (*t[:idx], *t[idx+1:])

print(tuple_pop((0,1, 2), 0))  # outputs (1, 2)
print(tuple_pop((0,1, 2), 1))  # outputs (0, 2)
print(tuple_pop((0,1, 2), 2))  # outputs (0, 1)

由于这些天越来越流行,我还添加了类型do函数定义。