在给定条件下从python中的列表中提取子列表的简短方法

时间:2014-12-07 17:25:16

标签: python arrays list class

我有一个特别的问题,我必须做出最简单但仍然反映的问题,并且需要知道有一个简短的方法来做到这一点。

class Foo(object):
    def __init__(self, c):
        self.bar=c

objects = [Foo(x) for x in 'ab..$...$x.z']

现在我们有了对象列表,这就是问题所在;我必须将列表缩短为'.'之间的所有对象,其中两个属性来自给定索引的左侧和右侧的'$' bar 属性。 索引是通过某些计算返回的,不一定会使用bar='.'命中对象,因此返回[]

因此[x.bar for x in objects]应为['.','.','.']。我试图用最简单的方式来表示问题,对不起给您带来任何不便......

关键是,代码应该很短。谢谢。

4 个答案:

答案 0 :(得分:3)

您可以使用re来执行此操作:

如果您有1个子字符串:

objects = [x for x in re.search('\$(.*?)\$', 'ab..$...$x.z').groups()[0]]

如果你有未知数量的子串:

objects = [y for x in re.finditer('\$(.*?)\$', 'ab..$123$x.,,,$abc$,,,') for y in x.groups()[0]]

答案 1 :(得分:2)

您需要使用字典来获取对象集合并使用正则表达式来获取$之间的所有内容:

>>> objects = {'a%d'%i:Foo(x) for i,x in enumerate(list(re.search(r'\$(.*)\$','ab..$...$x.z').group(1)))}
>>> objects
{'a1': <__main__.Foo object at 0x7ff1a6952b90>, 'a0': <__main__.Foo object at 0x7ff1a6952a50>, 'a2': <__main__.Foo object at 0x7ff1a6952bd0>}
>>> objects['a0'].bar
'.'
>>> objects['a1'].bar
'.'
>>> objects['a2'].bar
'.'

然后您可以使用objects.values()获取对象列表。

>>> obj=objects.values()
>>> [x.bar for x in obj]
['.', '.', '.']

如果你不想使用字典,并希望对象列表使用如下列表理解:

>>> objects = [Foo(x) for x in list(re.search(r'\$(.*)\$','ab..$...$x.z').group(1))]
>>> [x.bar for x in objects]
['.', '.', '.']

答案 2 :(得分:2)

class Foo(object):
    def __init__(self, c):
        self.bar=c

objects = [Foo(x) for x in 'ab..$111$x.z$222']

获取已发送的指数

z = [i for i, thing in enumerate(objects) if thing.bar == '$']

使用这些索引在sentinedals之间提取对象。

for i,j in zip(z, z[1:]):
    print map(operator.attrgetter('bar'), objects[i+1:j])

>>> 
['1', '1', '1']
['x', '.', 'z']
>>> 

创建对象列表 - 发送的每个间隔的一个子列表:

what_i_want = [objects[i+1:j] for i,j in zip(z, z[1:])]

答案 3 :(得分:0)

试试这个:

objects = [Foo(x) for x in 'ab..$...$x.z'.split('$')[1]]

[x.bar for x in objects]的输出为['.','.','.']

对于给定的输入(即只有两个&#39; $&#39;符号),这肯定有效。