我有一个特别的问题,我必须做出最简单但仍然反映的问题,并且需要知道有一个简短的方法来做到这一点。
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]
应为['.','.','.']
。我试图用最简单的方式来表示问题,对不起给您带来任何不便......
关键是,代码应该很短。谢谢。
答案 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;符号),这肯定有效。