带索引列表的访问列表

2024-10-05 14:32:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从两个列表中创建一个新列表。你知道吗

一个列表(自序)包含由来自QlineEdit()的输入生成的所需索引。例如,当我在QlineEdit中键入0,1,2,6:11,0,23时,输出的列表如下所示(输入自动转换为unicode):

[u'0', u'1', u'2', u'6:11', u'0', u'23']

另一个列表(xcoord)只是一个常规的值列表。你知道吗

新创建的列表应该包含列表中的值(自序)但只在索引从列表(坐标)。 这是我的密码。现在给出了一个类型错误:列表索引必须是整数,而不是列表

    self.sequence_input = QtGui.QLineEdit()    

def on_adjust(self):
    self.sequence = self.sequence_input.text().split(',')
    print self.sequence
    self.xseq = self.xcoord[self.sequence]
    self.yseq = self.ycoord[self.sequence]
    print self.xse

我以前也研究过类似的问题,但我无法将答案应用到我的案例中。我对python还比较陌生。你知道吗


Tags: self密码类型列表input键入错误unicode
3条回答

列表索引必须是int

self.sequence的值是[u'0', u'1', u'2', u'0', u'23'](这里省略了片段,下面有更多内容)意味着它是unicode字符串的列表,要使用其中的值作为列表索引,您必须将这些值转换为int例如

int_sequeneces = [int(x) for x in self.sequence]

现在,int_sequences中的每个元素都是一个int,可以用来索引列表

例如

first_index = int_sequences[0]
self.xcoord[first_index]

“用列表访问列表”,简单的列表理解就可以了

因此,要获得xcoordycoord的所有序列,可以执行以下操作:

self.xseq = [self.xcoord[index] for index in int_sequences]
self.yseq = [self.ycoord[index] for index in int_sequences]

扩展切片

def expand_slice(x):
    """ 
    Converts '6:11' to [6, 7, 8, 9, 10]
    """
    a, b = x.split(':')
    return list(xrange(int(a), int(b)))

def parse_seq(x):
    """
    Deals with both int and slices in a uniform way,
    by returning a list of indices
    """
    return expand_slice(x) if ':' in x else [int(x)]

压扁

对于要用作索引列表的列表,它需要是平面的,其中每个元素都是有效的索引,例如int,如[1, 2, 3, 4, 5]中的,而不是[1, [2, 3, 4], 5]。我们可以使用下面的代码用itertools.chain()将其展平

itertools.chain(*[parse_seq(x) for x in index_and_slices])

它的行为类似于一个列表,但您可以显式地将其转换为list()显示

把它们放在一起

In [28]: import itertools

In [29]: def expand_slice(x): a, b = x.split(':'); return list(xrange(int(a), int(b)))

In [30]: def parse_seq(x): return expand_slice(x) if ':' in x else [int(x)]

In [31]: index_and_slices = [u'0', u'1', u'2', u'6:11', u'0', u'23']

In [32]: [parse_seq(x) for x in index_and_slices]
Out[33]: [[0], [1], [2], [6, 7, 8, 9, 10], [0], [23]]

In [32]: list(itertools.chain(*[parse_seq(x) for x in index_and_slices]))
Out[32]: [0, 1, 2, 6, 7, 8, 9, 10, 0, 23]

注意

  • 如果6:11表示[6, 7, 8, 9, 10, 11],只需相应地修改expand_slice()函数,例如使用xrange(int(a), int(b) + 1),但我在这里输入的行为是Python传统中的默认行为

  • 我不会对您的输入进行验证,但您可以在异常出现时捕获异常并将其报告给接口(在Python中,请求原谅通常比请求允许更优雅)

将字符串列表(带片段)转换为python列表的常规索引器

不能使用字符串对列表进行索引或切片。您必须将输入从unicode解析为int。问题是您还有片6:11。 解决方案可以是这样的:

self.sequence = self.sequence_input.text().split(',')
print self.sequence
for obj in self.sequence.split(':'):
    to_add = obj[0] if len(obj) < 2 else slice(obj[0], obj[1])
    self.xseq.append(self.xcoord[to_add])
    self.yseq.append(self.ycoord[to_add])

将最终列表展平

现在您可能有一个列表,因为切片返回一个列表。然后可以同时展平self.xseqself.yseq。你知道吗

import itertools

self.xseq = itertools.chain(*self.xseq)
self.yseq = itertools.chain(*self.yseq)

以下是一种稍微不同的方法:

xcoord = [1,5,10,15,5,3,5,20,80,70,1,5,10,15,5,3,5,20,80,70,1,5,10,15,5,3,5,20,80,70]
ycoord = [0,2,7,3,8,50,4,6,3,0,2,7,3,8,50,4,6,3,0,2,7,3,8,50,4,6,3,0]
sequences = [u'0', u'1', u'2', u'6:11', u'0', u'23']

xseq = []
yseq = []

for sequence in sequences:
    try:
        exec("xseq.append(xcoord[%s])" % sequence)
        exec("yseq.append(ycoord[%s])" % sequence)
    except IndexError:
        print "Slice sequence %s is out of range" % sequence
        break

print xseq
print yseq

这为我的示例数据提供了以下输出:

[1, 5, 10, [5, 20, 80, 70, 1], 1, 15]
[0, 2, 7, [4, 6, 3, 0, 2], 0, 50]

注意,您需要确保序列经过消毒,只包含切片。你知道吗

相关问题 更多 >