1

我正在尝试在元组列表中插入“计数”(从 0 开始)。我有这样的事情:

list = [(1, 'Cat', 200, 3.2), (4, 'Dog', 204, 4.1), (2, 'Rabbit', 519, 2.0)]

我希望它是这样的:

list = [(1, 'Cat', 200, 0, 3.2), (4, 'Dog', 204, 1, 4.1), (2, 'Rabbit', 519, 2, 2.0)]

我试过这样的事情:

>>> i = 0
>>> for line in list:
...     list.insert(-2,i)
...     i+=1
...     print list

但它会在元组之间插入所有计数,这不是我想要的。任何人都可以帮助一个在这个问题上苦苦挣扎的 Python 初学者吗?谢谢!

4

4 回答 4

2

如果x是一个元组,那么i可以通过切片元组并将其连接在一起,将计数插入到请求的位置:

x[:3] + (i,) + x[3:]

(i,)创建单元素元组的(有些尴尬的)语法在哪里。例如

>>> x = (1, 'Cat', 200, 3.2)
>>> x[:3] + (0,) + x[3:]
(1, 'Cat', 200, 0, 3.2)

请注意,这会创建一个新元组。您不能在 Python 中修改现有的元组;为此,您需要一份清单。

您的代码在元组之间插入计数的原因是您混淆了listandline变量;您正在list对其元素进行操作。

(但是当您发现自己在处理五元素元组时,您应该开始考虑使用任意namedtuple类或自定义类。)

于 2012-10-23T20:49:08.147 回答
2
In [11]: lis=[(1, 'Cat', 200, 3.2), (4, 'Dog', 204, 4.1), (2, 'Rabbit', 519, 2.0)]

In [12]: lis=map(list,lis) #convert tuples to list


In [13]: lis       #now lis is list of lists instead of list of tuples
Out[13]: 
[[1, 'Cat', 200, 3.2000000000000002],
 [4, 'Dog', 204, 4.0999999999999996],
 [2, 'Rabbit', 519, 2.0]]

#use enumerate() for indexes, no need of manual indexing

In [14]: for i,x in enumerate(lis):
    x.insert(-1,i)                #insert at -1 not -2
   ....:     
   ....:     

In [15]: lis
Out[15]: 
[[1, 'Cat', 200, 0, 3.2000000000000002],
 [4, 'Dog', 204, 1, 4.0999999999999996],
 [2, 'Rabbit', 519, 2, 2.0]]
于 2012-10-23T20:55:31.543 回答
1

您不能修改元组。在里面使用列表。也尽量不要在其他类之后命名变量(列表是类名)。

data = [[1, 'Cat', 200, 3.2], [4, 'Dog', 204, 4.1], [2, 'Rabbit', 519, 2.0]]
for index, line in enumerate(data):
    line.insert(-1,index)
    print(data)

如果您想从原始元组列表中删除,一种简单的方法是在循环中制作副本:

newdata=[]
for index, line in enumerate(data):
    linecopy = list(line)
    linecopy.insert(-1,index)
    newdata.append(linecopy)
    print(newdata)
于 2012-10-23T20:50:50.230 回答
1

元组是不可变的(这意味着它们在创建后无法更改)。您将需要创建一个新元组并存储它。试试这个:

def insert_counts(old_list):
    new_list = []
    i=0
    for old_tuple in old_list:
        new_tuple = (old_tuple[0:2] + (i,) + old_tuple[2:])
        new_list.append(new_tuple)
        i+=1
    return new_list
于 2012-10-23T21:02:41.527 回答