• 締切済み

Pythonのanyって何?

下のPythonのプログラムにおいて、any()とは何をしているんでしょうか。たしかに取ると動かなくなります。 $ cat fruits.txt Banana Orange Navel Strawberry Apple $ cat fruits.txt | python -c 'import sys; any(print(l,end="") for l in sorted(sys.stdin))' Apple Banana Navel Orange Strawberry $

  • Python
  • 回答数1
  • ありがとう数1

みんなの回答

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.1

 まず、any関数の意味です。この関数は、引数にイテレータをとります。そして、その中の一つでもtrueなら、trueを返します。  この使い方は、器用ですね。正直、any関数の意味なんてお構いなしに見えます。戻り値もどうでもよい。ただ、イテレータを取り、何の副作用も無いという関数が欲しかった。つまり、関数の構文だけが欲しかったようです。その理由は、ジェネレータを使いたかったから。ジェネレータの中でprint文を利用して必要な出力をしてしまったのは良いが、ジェネレータはあくまでイテレータを返しますから、そのイテレータを捨てるゴミ箱が欲しかったと言った感じです。  ジェネレータを使うにしても、  print("".join(l for l in sorted(sys.stdin)))  の方が素直な気がします。  と考えれば、もともとsortedはリストを返すわけで・・・  print("".join(sorted(sys.stdin)))  でも、結果は一緒ですねぇ・・・  何故にこんな面倒なことをしたのやら?

TYWalker
質問者

お礼

ありがとうございます! joinなるほどですね。 上のプログラムはブログで発見したのですが、もとは python -c 'import sys; any(print(l,end="") for l in sorted(sys.stdin.readlines()))' で、他のブログに「sys.stdinにreadline()、readlines()は不要」と書かれていたので取ったものです。 他のブログを見ても、forをanyで囲ったものが多くありますが、コピペの源流を知りたいです。。 python -c 'import sys; [print(l,end="") for l in sorted(sys.stdin)]' というのもありました。 python -c 'import sys; print(*sorted(sys.stdin), sep="")' というのもいけるっぽいですね。 でもjoinを使ったやり方が、何をしているのかはっきり分かって、短くて好きです^^

関連するQ&A

  • 配列に新しい値を加える

    配列に新しい値を加えようとしているのですが、どうもうまくいってくれません。array_push を使用してもうまくいかないのでどうしたものかと悩んでいます。 $fruits = "banana melon orange strawberry"; $fruits = explode (' ', $fruits); $fruits = array_push ($fruits, "apple"); print_r($fruits); とすると 5 が表示されます。一方3行目を消すと Array ( [0] => banana [1] => melon [2] => orange [3] => strawberry ) が表示されます。 配列に新しい値を加えるやり方をご存知の方おられましたらご教授くださるとうれしく思います。

    • ベストアンサー
    • PHP
  • 再帰の仕方

    現在配列の出力結果が↓なのですがこれを array(2) { [0]=> string(6) "orange" [1]=> array(2) { [0]=> string(6) "apple" [1]=> array(2) { [0]=> string(6) "banana" [1]=> array(2) { [0]=> string(10) "Strawberry" } } } } ↓こっちのように変えたい場合の処理がどうしてもできません。 array(2) { [0]=> string(6) "orange" [1]=> string(6) "apple" [2]=> string(6) "banana" [3]=> string(10) "Strawberry" } 今自分がやってる途中のものです↓ $fruit = array("orange", array("apple", array("banana", array("Strawberry")))); function first_array($fruit) { foreach($fruit as $key => $value) { if(! is_array($value) === true ) { echo $value; } else { first_array($value); } } } $new_array = first_array($fruit); echo で orangeapplebananaStrawberry と表示はされるのですが、 配列に入れる方法がわかりません。 普通にこの部分を ~ if(! is_array($value) === true ) { $array[] = $value; } ~ とすると上書きされてしまっているのかな? 一個しかデータが残ってないのです・・・。 ご教授ください。

    • ベストアンサー
    • PHP
  • Python os.system 日本語ファイル名 文字化け

    python2.6 ubuntu 9.04 x64 ファイル文字コード UTF-8 # -*- coding: UTF-8 -*- import os, sys command = 'echo "あいうえお" > あああ.txt' os.system (command) このようにファイル出力すると、_____.txt と出力されます。 どのように解決するのでしょうか 直接 echo "あいうえお" > あああ.txt' とコマンドを打った場合は日本語ファイルが作成されます。 print sys.getfilesystemencoding() print sys.stdin.encoding print sys.stdout.encoding print sys.stderr.encoding print sys.getdefaultencoding() >UTF-8 >UTF-8 >UTF-8 >UTF-8 >ascii

  • teraterm上でpythonを使いcsvファイルでいろいろやりたいんですが,...

    すいません。pythonを使いはじめてまだ3日のド素人の意見と思いお付き合いしてください。 pythonで、csvファイルの中にあるカラム10番目の項目にある人数を、1番目のフィールドは項目名なので読みとばして足し合わせいきたいんですが、まだ理解がぜんぜん足りなくて #!/usr/bin/env/python #!coding: utf-8   import sys,string,csv   for line in sys.stdin.readlines(): words = string.split(line, ',')   sum += string.lower(word[10])   print sum と書いて、ファイルを読み込むんですけど、うんともすんとも言わないです。 どなたかアドバイス御願いします。

  • Pythonのバージョンアップについて

    CentOS5.5にはPython2.4がデフォルトで入っているのですが、Python2.6でスクリプトを作成する必要がありバージョンアップをしているのですが、dbusモジュールのインポートができず行き詰っております。 具体的には、Python2.4とdbus-pythonがインストールされている状態で、下記のURLを参考にyumでPython2.6をインストールしました。 環境としては「/usr/bin/phthon2.4」と「/usr/bin/phthon2.6」が出来た状態です。 libは「「/usr/lib/phthon2.4」と「/usr/lib/phthon2.6」です。 dbus-pythonのインストール先は「/usr/lib64/python2.4/site-packages/dbus」になります。 Python2.4を環境で下記のインポートは問題ありません。 >>>import dbus しかし、Python2.6環境で同じコマンドを実行すると下記のようなエラーになります。 >>> import dbus Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named dbus dbusの再インストールはリスクが高いと思い、モジュールのパスを通してみたところ下記のようなエラーになりました。 >>> import sys >>> sys.path.append('/usr/lib64/python2.4/site-packages') >>> import dbus Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python2.4/site-packages/dbus/__init__.py", line 1, in <module> from _dbus import * File "/usr/lib64/python2.4/site-packages/dbus/_dbus.py", line 45, in <module> import dbus_bindings ImportError: /usr/lib64/python2.4/site-packages/dbus/dbus_bindings.so: undefined symbol: Py_InitModule4 rpmでモジュールインストール先の変更や、Python自体をソースからインストールなどしてみたのですが、全てうまく行かない状態です。 Pythonバージョンアップ前にインストールされているモジュールの使い方をご存知の方がおられましたら、宜しくお願いします。

  • T-SQL 文字列関数について教えてください。

    T-SQL 初心者です。 下のようなcolumn(fruits year)があって、右の年度(2011)を削除して左側の果物の名前だけ表示したいのですがどのようにやったらいいでしょうか。 SUBSTRINGやLEFTを使うと左から始まって何桁目までという指示ができますが、果物の名前のみは桁数が違うので使えません。 よろしくお願いします。 Column: fruits year APPLE 2011 LEMON 2011 STRAWBERRY 2011 ORANGE 2011 結果: APPLE LEMON STRAWBERRY ORANGE

  • ランキングシステムについて

    ランキングシステムを作っているのですが はじめに作ったときは それぞれの項目毎に一つのファイルを作って、そこに数値を記入していたんですが(こんなふうに) 好きな食べ物は? ファイル名 apple.txt 数値 5 ファイル名 banana.txt 数値 8 ファイル名 orange.txt 数値 6 データファイルを一つにして、そこからデータを読み込んだり編集したりしたいと思っているんですが(こんなふうに)、読み込んで画面上に出力することは出来るんですが、編集が上手くいきません data.txt 一行目 apple<>5 ニ行目 banana<>8 三行目 orange<>6 なにか上手い方法があったら教えてください

    • 締切済み
    • PHP
  • PHP foreach文

    PHPのforeach構文なのですが以下ソースコードの13行目、foreach文の中の「$juice」なのですが、どこから出てきた物なのでしょうか? 今PHPの参考サイトを見ながら学習という形をとっているのですが 「$juice」が何処から出てきた物かわかりません。 サブライムテキストのラインハイライトで掛けても見つからなかったので... 参考URL http://creive.me/archives/8719/ <html> <head><title>accesslog.php</title></head> <body> <?php $fruits_juice = array( 'orange' => 'orange juice', 'melon' => 'melon juice', 'grape' => 'grape juice', 'banana' => 'banana juice', 'strawberry' => 'strawberry juice' ); foreach ($fruits_juice as $fruit => $juice) { echo $fruit . "(果物) => " . $juice . "(ジュース)<br>"; } ?> </body> </html>

    • ベストアンサー
    • PHP
  • htaccess URLリライトについて

    自社レンタルサーバ(heteml)では稼働した以下のURLリライトが クライアントのサーバー(使えるネット)でうまく稼働してくれません Options FollowSymLinks RewriteEngine on RewriteRule ^([^/]*)/$ index\.php?cat_l=$1 RewriteRule ^([^/]*)/([^/]*)/$ index\.php?catl=$1&cat_m=$2 ./fruit/apple/ ↓ ./index.php?cat_l=fruit&cat_m=apple となってほしいのですが ./index.php?cat_l=&cat_m=apple となり cat_mだけが渡されてcat_lが空になってしまいます 中途半端に動いているので逆に原因が分かりません よろしくお願いします

    • ベストアンサー
    • PHP
  • pythonでスクレイピングがうまく出来ません

    python2.7でbeautifulsoupを用いて、netkeiba.comから競馬情報(騎手の成績)をスクレイピングしています。 定法に基づきまして、『検証』からページのツリー構造を把握して、プログラムを作成しました。 馬名部分の構造が<td class="txt_l"> <a href="/horse/2011105901">テンテマリ</a></td> #テンテマリは馬名 となっておりましたので、"txt_l"を拾い出せるようにスクリプトを作りました。 しかしながら、 馬名以外の"txt_l"は全部スクレイピング出来るのですが、馬名部分だけがNoneと返ってまいります。 エラーメッセージではありませんが、何が原因でNoneとなるのかが、どうしても分かりません。 ちなみに、馬名以外で、ほぼ同様の構造を持つ、『レース名』、構造は <td class="bml txt_l"> <a href="/race/201603020812/" title="3歳上500万円下">3歳上500万円下</a> (3歳上500万円下はレース名) では、問題なくレース名を拾うことが出来ました。 該当のソースコード -*- coding:utf-8 -*- import urllib2 import codecs from bs4 import BeautifulSoup tpl_url='http://db.netkeiba.com/?pid=jockey_detail&id=00663&page={0}' for i in xrange( 1, 2 ): url=tpl_url.format( i ) soup = BeautifulSoup(urllib2.urlopen(url).read(),"lxml") tr_arr = soup.find('div', {'id':'contents_liquid'}).findAll('tbody') for tr in tr_arr: lrg1 = tr.findAll('td',{'class':'txt_l'}) for tr1 in lrg1: print tr1.string 試したこと 馬名以外の('td',{'class':'txt_l'})に準ずる『レース名』は、うまく拾うことが出来ました。 lrg1 = tr.findAll('td',{'class':'txt_l'}) で馬名を得ることが出来ない理由、併せて馬名を拾えるスクリプトを御教示くださいますよう、よろしくお願いいたします!

専門家に質問してみよう