3

オブジェクトに対してforメンバー時間を呼び出す非明示的な方法はありますか?n

私はいくつかのアプローチを考えていmap/reduce/lambdaましたが、可能であれば、これを行う方法を見つけることができませんでした。

コンテキストを追加するために、を使用してBeautifulSoupおり、htmlテーブルからいくつかの要素を抽出しています。いくつかの要素を抽出し、次に最後の要素を抽出します。

私が持っているので:

# First value
print value.text

# Second value
value = value.nextSibling
print value.text

# Ninth value
for i in xrange(1, 7):
    value = value.nextSibling
print value.text

lambda私はこれを可能にするアプローチ(または何か他のもの)があるかどうか疑問に思っていました:

# Ninth value
((value = value.nextSibling) for i in xrange(1, 7))
print value.text

forPS:いいえ、私がワンライナーソリューションを本当に楽しんでいることを除いて、このアプローチには何の問題もありません。これは私のコードに非常にうまく適合します。

4

6 に答える 6

7

私はループを強く好みますが、次を使用できますreduce

>>> class Foo(object):
...     def __init__(self):
...        self.count = 0
...     def callme(self):
...        self.count += 1
...        return self
... 
>>> a = Foo()
>>> reduce(lambda x,y:x.callme(),range(7),a)
<__main__.Foo object at 0xec390>
>>> a.count
7
于 2013-01-31T22:02:43.127 に答える
4

これに相当するワンライナーが必要です。

for i in xrange(1, 7):
    value = value.nextSibling

これは1行です:

for i in xrange(1, 7): value = value.nextSibling

もっと機能的なものを探しているなら、本当に欲しいのは関数なので、7回compose作曲callme()(または何でも)できます。attrgetter('my_prop')

于 2013-01-31T22:07:09.847 に答える
2

の場合は、BSを使用nextSiblingGenerator()itertools.isliceてn番目の兄弟を取得できます。また、n番目の要素がない状況も処理します。

from itertools import islice

nth = 7
next(islice(elem.nextSiblingGenerator(), nth, None), None)
于 2013-01-31T22:18:31.117 に答える
2

免責事項:eval悪です。

value = eval('value' + ('.nextSibling' * 7))
于 2013-01-31T22:49:14.410 に答える
1

ああ!ただしreduce、少なくとも組み込みとしては、Python3では使用できません。

これが私の試みです。Python2/3に移植可能で、OPの失敗した試みに基づいています。

[globals().update(value=value.nextSibling) for i in range(7)]

valueこれは、がグローバル変数であることを前提としています。値がたまたまメンバー変数である場合は、代わりに次のように記述します。

[self.__dict__.update(value=value.nextSibling) for i in range(7)]

locals()リスト内包表記はネストされたローカルスコープを作成するため、使用できません。そのため、実数locals()は直接利用できません。ただし、少しの作業でそれをキャプチャできます。

(lambda loc : [loc.update(x=x.nextSibling) for i in range(7)])(locals())

または、行数を複製してもかまわない場合は、次のようになります。

loc = locals()
[loc.update(value=value.nextSibling) for i in range(7)]

または、本当にワンライナーが好きな場合:

loc = locals() ; [loc.update(value=value.nextSibling) for i in range(7)]

はい、Pythonは;あまりにも使用できます8-)

更新

mapリスト内包表記の代わりに、もう1つの派手なバリエーション:

list(map(lambda d : d.update(value=value.nextSibling), 7 * [locals()]))

リスト乗算を巧妙に使用して、現在のデータをキャプチャし、同時に最初の反復可能オブジェクトを作成するlocals() ことに注意してください。

于 2013-01-31T22:35:22.073 に答える
1

それを書く最も直接的な方法は次のとおりです。

value = reduce(lambda x, _: x.nextSibling, xrange(1,7), value)
于 2013-02-01T09:27:08.120 に答える