くだすれPython(超初心者用) その21at TECH
くだすれPython(超初心者用) その21 - 暇つぶし2ch1:デフォルトの名無しさん
14/01/02 12:52:08.79
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
へび使いが優しくコメントを返しますが、お礼は Python の布教と初心者の救済をお願いします。

エラーを解決したいときはエラー表示や環境(バージョン/IDE or command line)を略さずに書き込んで下さい。
騙りが頻発しています。質問する方は一時的なトリップをつけることを検討して下さい。
次スレは >>985 辺りで

前スレ
くだすれPython(超初心者用) その20
スレリンク(tech板)
関連スレ
Pythonのお勉強 Part49
スレリンク(tech板)

◆関連リンク
Python の Home Page
URLリンク(www.python.org)

◆長いコードはこういうところにはってください
URLリンク(ideone.com)
URLリンク(codepad.org)
URLリンク(pastebin.com)
URLリンク(dpaste.com)

◆まとめwiki
URLリンク(python.rdy.jp)

2:デフォルトの名無しさん
14/01/02 12:56:27.58
|....,,__
|_::;; ~"'ヽ
| //^''ヽ,,)
|  i⌒"
| ∀`) < 誰もいない きのこるならいまのうち
|⊂
| ノ
      _,,,......,,__
  /_~ ,,...:::_::;; ~"'ヽ
 (,, '"ヾヽ  i|i //^''ヽ,,)
   ^ :'⌒i    i⌒"
      |( ´∀`) < きのこ のこーのこ げんきのこ ♪
      |(ノ   |つ
      |     |
     ⊂ _ ノ
       ""U
      _,,,......,,__
  /_~ ,,...:::_::;; ~"'ヽ
 (,, '"ヾヽ  i|i //^''ヽ,,)
   ^ :'⌒i    i⌒"
     (´∀` )| < エリンギ まいたけ ブナシメジ ♪
    ⊂|  (ノ |
      |     |
      ヽ _ ⊃
      .U""
|
| ミ
| ミ  サッ!
| ミ
|

3:デフォルトの名無しさん
14/01/02 12:57:08.78
   ┌─┐
   │●│
   └─┤
   _   ∩
  ( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘

4:デフォルトの名無しさん
14/01/02 12:58:00.03
>>1
URLリンク(python.rdy.jp)
URLリンク(python.rdy.jp)

ここも古いのでさっさと直せ

5:デフォルトの名無しさん
14/01/02 13:02:30.83
前スレ990です。>>1乙。

6:デフォルトの名無しさん
14/01/02 13:03:22.25
いちおつ。規制厳しいね

7:デフォルトの名無しさん
14/01/02 13:14:54.45
976 名前:デフォルトの名無しさん [sage]: 2014/01/02(木) 11:50:33.13
>>975
>>973より引用
URLリンク(interactivepython.org)

この一文を訳してみてね。簡単なんでしょ?
> The base of the stack is significant since items stored in the stack that are closer to the base represent those that have been in the stack the longest.

8:デフォルトの名無しさん
14/01/02 14:40:22.27
>>7
単語と接続詞が多すぎて全く意味不明だな
スタックのことだろうというのはIT畑の人なら雰囲気でわかるが…
もう少し短くスマートな文を書こうという気はないのだろうか英米人は

9:デフォルトの名無しさん
14/01/02 16:06:33.56
すでに2時間黙ってるけどどうしたの?癇に障った?ねえ黙ってないで答えてよ。黙らなくていいよ。黙る気ないでしょ?無理しなくていいんだよ。黙らなくていいんだよさあさあさあ

10:!omikuji!dama
14/01/02 16:09:43.88
何やってんだかw

11:デフォルトの名無しさん
14/01/02 16:39:20.24
新年早々ね

12:デフォルトの名無しさん
14/01/02 17:18:30.56
スレが過疎なのは
Pythonがあまりにも完璧・使いやすすぎて
語る必要もないということなのだろうな
良きことだ

13:デフォルトの名無しさん
14/01/02 17:48:14.14
それじゃあ質問
今居る関数の、関数オブジェクトを表している特殊変数ありませんか?
下記のような時 __self__ みたいな特殊変数があると
this = hoge_hoge_fuga_fuga しなくて済むのだけど

def hoge_hoge_fuga_fuga():
  this = hoge_hoge_fuga_fuga
  if 'x' not in this.__dict__:
    this.__dict__['x'] = 100
  this.x += 1
  print(this.x)

hoge_hoge_fuga_fuga()
hoge_hoge_fuga_fuga()

14:デフォルトの名無しさん
14/01/02 18:47:32.96
>>13
特殊変数はない。スタックフレームから参照する方法はあるけど、いろいろな状況での利用を考えると面倒なのでお勧めしない。
目的によって異なるけど、考えられる代案はこんなとこ

関数定義時に関数オブジェクトを参照し属性を設定する -> デコレータが使える
値を持つ、呼び出し可能なオブジェクトを作りたいなら __call__ を調べてみよう
クロージャ的な用法(関数内にデータを内包したい)なら、ジェネレータにするといい。@see also itertools.count

ideone.com/mFBFqg

15:デフォルトの名無しさん
14/01/02 19:06:36.30
すみません、初心者なんですが以下の日本語部分がすべて文字化けしてしまいます。
.pyファイルを秀丸などでutf-8nで保存しても次開くとSJISになってしまっているのでそれが原因でしょうか?
解決方法を教えてください。。

# -*- coding: utf-8 -*

import urllib2
from BeautifulSoup import BeautifulSoup

url = "YahooTOPのURL"
soup = BeautifulSoup(urllib2.urlopen(url).read(), fromEncoding='utf-8')

print soup

16:デフォルトの名無しさん
14/01/02 19:09:39.12
>>14
ありがと。無いなら諦めるw
使用目的は、単に関数内スタティック変数として使うため。
入力と結果が1対1で対応してる処理が重たい関数で、
結果を辞書にキャッシュさせるのにスタティック変数は良く使うので

17:デフォルトの名無しさん
14/01/02 19:44:33.61
>>15
そのurlって実在するの?
日本語を含むurlなんて聞いたことがないんだが

18:デフォルトの名無しさん
14/01/02 19:49:04.57
>>15
文字列前にuをつけてみて
str型ではなくunicode型じゃないとうまくいかない

>>16
横からだけど、そういうことならグローバル直下に辞書をおくといいよ
python3だったらfunctools.lru_cacheをつかうのもいいよ

19:デフォルトの名無しさん
14/01/02 20:31:40.15
>>15
>.pyファイルを秀丸などでutf-8nで保存しても次開くとSJISになってしまっているのでそれが原因でしょうか?
ファイルに日本語がなくてASCIIだけだったら、エディタの文字コード判別がデフォルトのSJISとみなしているんじゃないかな。ソースに日本語のコメント入れて保存してみそ。
それでこれは問題の文字化けとは多分関係ない。

yahooトップページって文字コードutf-8だっけ?その辺が怪しそうな気がする

20:デフォルトの名無しさん
14/01/02 20:37:45.39
>>17
URL規制で書けなかったので日本語にしてました
>>18
soup = unicode(soup.prettify(), soup.originalEncoding)
すみません、色々調べてこれ入れたらできました!
>>19
あーSJISのままなのはそういう意味だったんですね。。スッキリしました。yahooはutf-8でした!

皆さんありがとうございました

21:デフォルトの名無しさん
14/01/02 20:39:20.74
>>15
print soup.decode('utf-8')
こうかな?

22:デフォルトの名無しさん
14/01/02 20:46:04.09
>>21
それだとエラーでました。
TypeError: 'NoneType' object is not callable

23:デフォルトの名無しさん
14/01/02 23:22:59.34
>>16
そういった用途なら functools.lru_cacheに+1

スタティック変数について、他の代案も紹介しておくと、
グローバルの代わりにデフォルト引数に辞書を入れて、スタティックな領域として使う方法もある

注意点として、Pythonではデフォルト引数の評価タイミングが関数定義時なので、
他の言語からの人がコードを読んだ時、解りにくくなるという懸念はあるけど、
キャッシュに使う辞書を引数に与えられるので、関数の単体テストはしやすくなります

24:デフォルトの名無しさん
14/01/03 02:16:58.20
b'2966'を整数型の2966に直すにはどうしたらいいのでしょうか

25:24
14/01/03 02:18:58.97
>>24 python3.3を使っています

26:デフォルトの名無しさん
14/01/03 02:30:36.06
>>24
int(b'2966'.decode('utf-8'))
かなあ?

27:24
14/01/03 02:33:54.86
>>26
出来ました!
ありがとうございます

28:デフォルトの名無しさん
14/01/03 02:34:54.92
int(b'2966')だけじゃだめなのか

29:24
14/01/03 02:42:01.88
>>28
それでいけました
ありがとうございます

30:デフォルトの名無しさん
14/01/03 07:52:37.85
pythonを2.6から2.7へバージョンアップしたら
インストールしたモジュール使えなくなったんですけど
これは参照している場所が違うからでしょうか
OSはMACです

31:デフォルトの名無しさん
14/01/03 08:44:13.17
>>18>>23
ありがと
標準ライブラリにキャッシュ機能を提供してくれるものがあったとはPythonすげー
デフォルト引数に辞書の方法は、簡単で便利ですね

32:デフォルトの名無しさん
14/01/03 16:13:53.83
ja.wikipedia.org/wiki/Flask
軽量ウェブアプリフレームワーク Flask の解説で、

以下のサンプルコードは、ルートパスにアクセスすると "Hello World!" を表示するだけのアプリケーション
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
 return "Hello World!"
if __name__ == "__main__":
 app.run()
↑こんなのがあります。この appオブジェクトはどうして hello() の存在を認識できているんでしょうか? どうか解説をお願いします。
@~ は関数アノテーション?、これもよく分かっていません。

33:デフォルトの名無しさん
14/01/03 16:44:09.72
>>32
URLリンク(docs.python.jp)
URLリンク(docs.python.jp)

34:32
14/01/03 18:54:01.59
class App:
 def __init__(self):
  self.dic = {}
 def route(self,key):
  def proc(fun):
   self.dic[key] = fun
  return proc

myapp = App()

@myapp.route("/")
def foo():
 return "Welcome!"

@myapp.route("/menu")
def foo():
 return "Sorry, Japanese Only!"

myapp.dic["/"]()
=> "Welcome!"
myapp.dic["/menu"]()
=> "Sorry, Japanese Only!"

ありがとうございます。ほぼ理解できました。

35:デフォルトの名無しさん
14/01/04 00:01:18.74
そんな彼に忍び寄る恐ろしい罠

36:デフォルトの名無しさん
14/01/04 23:07:58.70
>>30 まずそのモジュールの2.7用が出てないかじゃないでしょうか。

37:デフォルトの名無しさん
14/01/07 16:31:27.57
>>8
最近みた日本語の悪文だとこんなのがある
URLリンク(ja.wikipedia.org)

38:デフォルトの名無しさん
14/01/08 00:08:29.85
>>37
読解にメモリ馬鹿食いする文章だな

39:デフォルトの名無しさん
14/01/08 13:40:33.62
num = 10
self.board = [[0]*num]*num
for i in board:
 for j in i:
  j = 1

こんな風にやっても案の定書き換えられてないんですけど!
リストを書き換えるスマートな方法を教えて欲しいんですけど!
盤面のオブジェクトを作って色んな書き換えるメソッドを呼び出して何度も書き換える予定なんですけど!
とりあえずライフゲーム作るんですけど!

40:デフォルトの名無しさん
14/01/08 15:25:06.10
URLリンク(pastebin.com)
こういうのとか
>>> import test
>>> f = test.Foo(3)
>>> f.update_list(3)
>>> print(f.get_list())
[[3, 3, 3], [3, 3, 3], [3, 3, 3]]

41:39
14/01/08 16:09:58.94
>>40
ありがとうございます
map関数の使い方を勉強してきます

42:デフォルトの名無しさん
14/01/08 17:25:57.03
a = [[0]*3]*3
print(a)
a[1][1] = 1
print(a)

の実行結果が
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]
になります

期待してる結果は
[[0, 0, 0], [0, 1, 0], [0, 0, 0]]
です
これは一体何が起こっているのでしょうか
助けてください

Version : 3.3.3
Version tuple: ('3', '3', '3')
Compiler : MSC v.1600 32 bit (Intel)
Build : ('v3.3.3:c3896275c0f6', 'Nov 18 2013 21:18:40')

43:デフォルトの名無しさん
14/01/08 17:35:05.69
ちなみに、python2と3でmap関数の返り値違う
python2はリスト型
>>> type(map(add, a))
<type 'list'>
python3はmap型
>>> type(map(add, a))
<class 'map'>

map型のイテレータは一度処理終わったら、もどってくれないから注意
>>> b = map(add, a)
>>> list(b)
[2, 3, 4]
>>> list(b)
[]

44:デフォルトの名無しさん
14/01/08 17:40:29.16
>>42
参照だから
>>> id(a[0][1])
139713178044032
>>> id(a[1][1])
139713178044032
>>> id(a[2][1])
139713178044032
[0]*3

45:デフォルトの名無しさん
14/01/08 17:42:33.42
最後の行は無視して

46:デフォルトの名無しさん
14/01/08 17:57:47.61
>>42
あなたの希望は以下で満たせるはず。
後は自分で頑張って勉強して、それでも分からなければまた聞きに来て。
>>> a = [[0] * 3] * 3
>>> print(a)
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> for x in a:
... print("id(x) =", id(x))
...
id(x) = 140290763245184
id(x) = 140290763245184
id(x) = 140290763245184
>>> a[1][1] = 1
>>> print(a)
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]
>>> a = [None] * 3
>>> for i, x in enumerate(a):
... a[i] = [0] * 3
...
>>> print(a)
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> for x in a:
... print("id(x) =", id(x))
...
id(x) = 140290763245544
id(x) = 140290763244464
id(x) = 140290763245184
>>> a[0][0] = 1
>>> a[1][1] = 1
>>> a[2][2] = 1
>>> print(a)
[[1, 0, 0], [0, 1, 0], [0, 0, 1]]

47:42
14/01/08 18:13:05.04
>>44,46
ありがとうございます
頑張ります

48:42
14/01/08 18:17:03.24
リストの初期化の仕方で参照するところが変わるんですね
完全に嵌ってました

49:デフォルトの名無しさん
14/01/08 18:24:27.06
>>48
Python的にはノート(2)より
URLリンク(docs.python.jp)
[[0] * 3 for i in range(3)]
ミュータブルな要素のみ内包表記に置き換える感じで

50:デフォルトの名無しさん
14/01/08 18:25:10.19
あとはリスト内包表記使うとか
>>> a = [[0 for row in range(3)] for row in range(3)]
>>> a[1][1]=1
>>> a
[[0, 0, 0], [0, 1, 0], [0, 0, 0]]

51:デフォルトの名無しさん
14/01/09 01:12:22.59
ライフゲームってDemoに有ったような気がして、探してみたけど、
ソースから入れないと入らないのかな。./Tools/demo/life.py

替わりにこんなの見つけた

# タートルのデモ
> python3 -mturtledemo

# tkのデモをpythonから実行
from tkinter import Tk
tk = Tk()
tk.eval("source c:/Python33/tcl/tk8.5/demos/widget")
tk.mainloop()

52:デフォルトの名無しさん
14/01/11 21:56:49.85
>>> a=[1,2,3,4,5,0]
>>> [(i, x) for i, x in enumerate([x for x in a if x >= 3], start=1)]
[(1, 3), (2, 4), (3, 5)]

こういう風に、リストから条件を満たす要素だけ抜き出して
連番を付与してタプルのリストを作る目的がある
しかし、入力がリストではなく以下のようなテキストファイルの場合
1
2
3
4
5
0

enumerateの行にファイル読み込み処理をぶち込んでコードを短い
ままで済ますことは可能だろうか?
調べてみたのだが、ワンライナーでファイル処理を行う例が見つからなかった

53:デフォルトの名無しさん
14/01/11 22:15:37.35
>>52
openも一緒にやりたいってこと?

54:デフォルトの名無しさん
14/01/11 22:29:12.77
>>52
自分も初心者だけど

f = open('data.txt')
[(i, x) for i, x in enumerate([x for x in map(lambda s:int(s.rstrip('\r\n')), f) if x >= 3], start=1)]

55:デフォルトの名無しさん
14/01/11 22:29:54.85
>>53
そう
スクリプト言語の用途として
テキストフィルタ的なものはよく出会うので
ファイル処理を短く済ます定番句があると
楽だなあと思う次第

56:デフォルトの名無しさん
14/01/11 22:39:24.75
>>54
おおっと書いたとたんにレスが
サンクス
そのopenも一行にまとめてしまえないだろうかという話

57:デフォルトの名無しさん
14/01/11 22:41:17.49
じゃあ…

[(i, x) for i, x in enumerate([x for x in map(lambda s:int(s.rstrip('\r\n')), open('data.txt')) if x >= 3], start=1)]

58:デフォルトの名無しさん
14/01/11 22:43:51.34
>>55
with open('data.txt') as f: l = []
で一行にはなるけど,短くはむりぽ

59:デフォルトの名無しさん
14/01/11 22:51:26.70
>>57
カッコだらけなんだけど、インデントで書けないものか....

60:デフォルトの名無しさん
14/01/11 22:53:46.58
>>59
1行で書きたいのか複数行で書きたいのどっちなんだよw

61:デフォルトの名無しさん
14/01/11 23:15:42.68
tkinterっていろいろできそうなのに
あんまりはやってないようなのはなぜ?

ここのサイトが超わかりやすい!
URLリンク(www.shido.info)

62:デフォルトの名無しさん
14/01/11 23:21:44.22
リストの値をそれぞれ総当たりで含まれるかどうかをチェックして、含まれていれば削除したいんですがどうやればいいでしょうか?

list['abc','abcd','bcd','bbt','yyf','zat']を
list['abcd','bbt','yyf','zat']にしたい

for s in range(len(list)):
 x = list.pop()
 for k in list:
  if not x in k:
   list.append(x)

これだとうまくいきませんでした

63:デフォルトの名無しさん
14/01/11 23:29:01.42
>>62
リストの中の要素が重複してないならset使ったほうが楽かも

l = ['abc','abcd','bcd','bbt','yyf','zat']
k = ['abc','bcd']

egg = list(set(l) - set(k))

64:デフォルトの名無しさん
14/01/11 23:30:05.70
あ,どうせ消すんだから重複関係ないか・・・

65:デフォルトの名無しさん
14/01/12 00:15:57.50
PythonってRubyのRakeみたいなビルドとか自動化に使えるスクリプト
ツールってあるの?

66:デフォルトの名無しさん
14/01/12 00:22:45.66
GYP

67:デフォルトの名無しさん
14/01/12 00:25:00.51
Sons

68:デフォルトの名無しさん
14/01/12 02:30:10.24
x Sons

o SCons

69:デフォルトの名無しさん
14/01/12 05:45:41.99
awkみたいな行に対して処理をする起動オプションはない。
よくあるファイル処理のスクリプトはfileinputモジュール使う
sedのようなinplaceなファイルの書き換えも支援してくれる。

ワンライナ自体python向きではないけど、一応短くしてみると

ファイルから数列を読み込むのは、
intは前後の空白文字取り除いて変換してくれるので map(int, open("data.txt")) で済むよ。

[(i,x) for i,x in enumerate(...)] は list(enumerate(...)) 用途によってはlist()も不要。

70:デフォルトの名無しさん
14/01/12 09:36:05.29
Pythonでコーディングされてるオープンソースのソフトってどんなのがあるの?

71:デフォルトの名無しさん
14/01/12 09:42:19.69
全くありません
ゼロです

72:デフォルトの名無しさん
14/01/12 09:47:40.52
>>70
URLリンク(ja.wikipedia.org)を使っている製品あるいはソフトウェアの一覧

一部 Python で書かれてる的なのも含まれてるので注意

73:デフォルトの名無しさん
14/01/12 09:53:04.05
Sourceforgeだとこれかな
URLリンク(sourceforge.jp)
(プログラミング言語にPythonを使用しているプロジェクトの一覧)

74:デフォルトの名無しさん
14/01/12 10:27:14.21
じゃあこんなのも。星 1000 以上
URLリンク(github.com)

75:デフォルトの名無しさん
14/01/12 13:26:16.84
じゃあ俺も俺も。
URLリンク(code.google.com)

76:デフォルトの名無しさん
14/01/12 16:04:00.58
ゴミコードがいくら沢山集まっても、それはゴミの山である
                    ―カーニハン―

77:デフォルトの名無しさん
14/01/12 16:27:44.37
>>62
pythontutor.com/visualize.html

ここにコード書いてステップ実行すると、
1ステップ毎に変数やリストのデータがどのように変化するか表示してくれるので解りやすいよ。

同じリスト内の重複を取り除くのか、2つのリストから差分を除くのか
題意が読み取れなかったけど。リストで順序を保つなら collections.OrderedDict.fromkeys(xs).keys()

78:デフォルトの名無しさん
14/01/12 17:40:57.01
>>62
import __builtin__
list = ['abc','abcd','bcd','bbt','yyf','zat']
gomi = []
for i in range(len(list)):
  for j in range(len(list)):
    if i != j:
      if list[i] in list[j]:
        gomi.append(list[i])
        break
print __builtin__.list(set(list) - set(gomi))

79:デフォルトの名無しさん
14/01/12 18:18:34.03
>>62
L = ['abc','abcd','bcd','bbt','yyf','zat']
k = ['abc','bcd']
for i in range(len(L)-1, -1, -1):
 if L[i] in k:
  del L[i]
print(L)

80:デフォルトの名無しさん
14/01/12 18:21:28.98
含まれるって文字列中にって事だったのか.これで合ってる?

src = ["abc", "abcd", "bcd", "bbt", "yyf", "zat"]
dst = [x for x in src if all(not x in y for y in src if x != y)]
print(dst)

81:デフォルトの名無しさん
14/01/12 18:22:18.95
なぜ多くのプロジェクトがPythonの古いバージョンをサポートし続けるのか
ストーリー by headless 2014年01月12日 12時55分
URLリンク(developers.slashdot.jp)

82:デフォルトの名無しさん
14/01/12 18:25:49.84
not any にした方が効率よかったかも

dst = [x for x in src if not any(x in y for y in src if x != y)]

83:デフォルトの名無しさん
14/01/12 18:33:34.51
>MozillaのNathan Froyd氏は、Szorc氏の主張はソフトウェアを他の人々に提供する側の視点が欠けていることを指摘している。
>ユーザーがアップグレードを自由に行えるとは限らず、新しいバージョンで削除されたAPIを必要としていることもあるし、
>新しいバージョンで動作するようにコードを修正してテストするのは手間がかかる。

これ何の冗談だよ
クソいラピッドリリースをFireFoxに導入しくさってくださりやがりましたMozillaお前がその発言すんのかよ
コブラに噛まれて死ね
5回死ね

84:デフォルトの名無しさん
14/01/12 18:36:56.81
ワロタ

85:デフォルトの名無しさん
14/01/12 19:15:41.16
>>82
src = ['abc','abcd','abcd','abcd','bcd','bbt','yyf','zat']
↑こんな風に重複したものがあると残るからインデックスで比較するのがよさげ

dst = [x for i,x in enumerate(src) if not any(x in y for j,y in enumerate(src) if i!=j)]

多重ループ出来るの今日初めて知ったthx

86:デフォルトの名無しさん
14/01/12 19:19:47.69
>>81
こっちでやろうや
スレリンク(tech板)
>>62への回答の邪魔になりそうだし

87:85
14/01/12 19:25:20.62
ごめん間違い、インデックスだけじゃ無理か

88:デフォルトの名無しさん
14/01/12 19:45:10.90
dst = [x for i,x in enumerate(src) if not any(x in y for y in src if x!=y) and x not in src[i+1:]]

89:デフォルトの名無しさん
14/01/12 19:46:42.42
URLリンク(ideone.com)
関数型?っぽく

90:デフォルトの名無しさん
14/01/12 19:50:50.66
>>88
自分のプログラミングレベルだと、その内包表記の詰め込み具合はきつい

91:デフォルトの名無しさん
14/01/12 19:52:43.69
>>85
リスト要素の重複は、予め取り除いてから篩いに掛けた方がいいかな。
ループの回数も抑えられるし。

92:82
14/01/12 20:44:55.26
展開するとこんな感じ

dst = []
for x in src:
 for y in src:
  if x in y and x != y:
   break
 else:
  dst.append(x)

ここのelseは、ifではなく、内側のforに対応するelse。breakで抜けなかった時に実行されます。

結果から重複を取り除く場合は、for y の前に if x in dst: continue で対応。

93:デフォルトの名無しさん
14/01/12 22:30:52.10
URLリンク(ideone.com)

os.path.isfileとos.path.existsがうまく行きません
存在しているのにFalseになったり
存在しないのにTrueになったりします

なにか勘違いしているところありますでしょうか?
python33です

94:93
14/01/12 22:41:32.79
すいません
なんでもなかったです・・・

95:デフォルトの名無しさん
14/01/12 23:00:40.74
#set(src)の要素のうち、他のどの要素の一部(部分文字列)になっていないもののリスト(順番が変わっちゃうけど)
#src = ['abc', 'abcd', 'abcd', 'abcd', 'bcd', 'bbt', 'yyf', 'zat']
#なら dst = ['abcd', 'yyf', 'zat', 'bbt']
dst = [x for x in set(src) if all(x not in y for y in set(src)-set([x]))]

内包表現は書いた本人ですら後で分んなくなることがあるから困るけど好き。

96:デフォルトの名無しさん
14/01/12 23:16:56.22
>>93
パス(fpath)じゃなく数値(a)を渡してる

97:デフォルトの名無しさん
14/01/13 00:41:46.88
>>92
オリジナル(>>82)が関数型の内包表記で書かれているんだから、
わざわざ手続き型で書き直すでのはなく、
まず最初は以下のように展開するのがPythonらしいと思ふ

dst = [
  x for x in src
    if not any(
      x in y for y in src
        if x != y
    )
]

98:デフォルトの名無しさん
14/01/13 00:51:12.78
繰り返し中での一時オブジェクト生成は、極力排除した方が実行効率良いよ。

# >>62
from collections import OrderedDict
unique = lambda xs: OrderedDict.fromkeys(xs).keys()

src = unique(['abc', 'abcd', 'abcd', 'abcd', 'bcd', 'bbt', 'yyf', 'zat'])
dst = [x for x in src if not any(x in y for y in src if x != y)]

99:62
14/01/13 03:07:06.89
>>62です
うわこんなにレスをいただいてしまってなんかすみません・・・
質問の後にmapや再帰?でやってみてたんですが上手く行かず困っていました
いただいたレスを一つずつ試して見ます
ありがとうございました!

100:デフォルトの名無しさん
14/01/13 09:42:32.16
特定のフォルダを五分おきくらいに見て、新たに作成されたファイル名を
把握するっていうサーバー的アプリを作りたいが、監視でCPU100%になるのを
防ぐためには、スレッドという機能を使えばよいのかな?

何をしたいかというと、クライアントPCからサーバーのフォルダにファイルを
コピーすることで仕事のトリガーとするシステムを妄想しているのだ
WEB系の技術でやるべきものだろうけど、そっち系の知識がゼロなので

101:デフォルトの名無しさん
14/01/13 10:03:27.10
>特定のフォルダを五分おきくらいに見て、新たに作成されたファイル名を
>把握するっていうサーバー的アプリを作りたい
で運用に支障がでるほど、負荷がかかるとは思えない
サーバ的ってあるけどクライアント的な部分はどいういうものなの

>>100が作ろうとしてるものと、答えようとする人間の想像するものが違ってるくるかもしれないから
ディレクトリ内のファイル数とかも含めてもうちょい詳しく書いたほうがいい

102:デフォルトの名無しさん
14/01/13 10:05:06.45
すぐ作れるんだし作ってから色々と試してみる方がいいような

103:デフォルトの名無しさん
14/01/13 10:06:01.70
>>100
time.sleep で大丈夫だと思うけど

そういったシステムなら、ファイルシステムのイベント通知が使える。
watchdogというクロス・プラットフォームなライブラリがあるよ。

104:100
14/01/13 10:14:21.71
101読んで、再考

もしサーバってのがサーバ・プログラムのプロセスを指してるんだったら、
シングル・プロセスなサーバのプロセス内でsleepしちゃまずいか。
バックグラウンド・ジョブを想定してた。

でも、トリガにwatchdogは使えるので、後は適当なプロセス間通信の方法調べてがんばって。

105:103,104
14/01/13 10:17:43.86
番号間違えた。104の名前欄訂正 100>103

106:デフォルトの名無しさん
14/01/13 10:41:12.68
>>101
妄想を書いてみる
これらを全部PythonとWindowsのバッチファイルでやろうという試み
Web系って覚えることが多すぎて自分には無理
(ちなみに自分はただの事務員。金がないからお前が作れと言われた)

クライアントPCの仕様
・リクエスト内容を示すテキストファイルを作る
・Windowsのネットワークドライブ経由、バッチファイルで
サーバーのリクエスト受付フォルダに上記ファイルをCOPYする

ファイル数など
・クライアントPCは20台くらい、PCごとに一日10リクエストくらい、計200個のファイルを処理
・リクエストタイミングは不定

サーバーの処理内容
・データベースを持ち、リクエストに応じ検索・加工をした結果をCSVファイルに吐き出す

サーバーで処理した結果の返し方
・サーバー上にあるクライアントPCごとの返信専用フォルダに結果ファイルを格納
・クライアントPC操作者は頃合いを見て上記フォルダをエクスプローラで覗き持って行く

107:デフォルトの名無しさん
14/01/13 11:13:52.76
妄想ならチラシの裏にでも書いてろ

108:デフォルトの名無しさん
14/01/13 16:50:06.40
a = 0xd
b = 13
を区別する方法ってありますか?
0xdを評価するときに,13になるのでしょうか?

109:デフォルトの名無しさん
14/01/13 17:08:17.89
ないよ
16進数を理解できてないの?

110:デフォルトの名無しさん
14/01/13 17:51:31.41
>>109
すみません.確かにその通りですね

111:デフォルトの名無しさん
14/01/14 14:45:18.06
pyDevを使ってます
変数名の候補が出てこないんですが どうしたら出るようになりますか?
例えば

name = "a"
na

↑ここで name が出てほしいんですけど何も出ません

112:デフォルトの名無しさん
14/01/14 14:52:23.00
> To enable code completion, go to Window > Preferences > Pydev > Editor > Code Completion, and check the 'Use Code Completion?'
URLリンク(stackoverflow.com)

PyDev持ってねーから知らんけどこのへんでどうよ

113:111
14/01/14 14:53:31.32
自己解決しました すみません

114:デフォルトの名無しさん
14/01/15 20:10:26.97
とりあえずはいろんなデータを分析・解析したり、
必要なデータをすぐにアウトプットできるようなプログラムを作ってみたい

とりあえず入門としてPythonスタートブックっていうのを読んでみたんだけど、
次の参考書としておすすめの本ってありますか?

115:デフォルトの名無しさん
14/01/15 20:11:22.32
PythonじゃなくてRの本にすればいい

116:デフォルトの名無しさん
14/01/15 20:15:15.41
Pythonの勉強しておけばあとあといろんな応用がきくかなと…

117:デフォルトの名無しさん
14/01/15 21:07:20.79
NumPyのマニュアルを読めばいいよ

118:デフォルトの名無しさん
14/01/15 22:57:01.19
オレンジ色の本(本の名前失念)

119:デフォルトの名無しさん
14/01/16 01:58:58.78
O'ReillyのPythonによるデータ分析入門

120:デフォルトの名無しさん
14/01/16 11:34:54.23
全くの初心者で申し訳ないのですが
__init__のクラスの初期化って一体何のために必要なんですか?

121:デフォルトの名無しさん
14/01/16 12:02:34.80
インスタンス生成時にそのクラスを使う上で必要なオブジェクトを受け取るため

そのクラスを使うほうからしたら、あとになってからこれ要るよって言われるより
最初に言われたほうが書きやすい
>>> rq = urllib.request.Request()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'url'

122:デフォルトの名無しさん
14/01/16 17:29:23.08
>>121
ありがとう
じっくり考えてみる

123:デフォルトの名無しさん
14/01/17 00:57:49.42
import sqlite3

con = sqlite3.connect('a.db')
with con:
  ここでロールバックしてwithを抜けるスマートな方法って何かない?

例外を投げてwithの外側で捕捉する方法だと
インデントが深くなるからそれ以外でお願いします。

124:123
14/01/17 01:02:20.10
書き忘れましたがバージョンは2.6でお願いします

125:デフォルトの名無しさん
14/01/17 05:21:27.27
自分でrollback呼んで抜ければいいだろ・・・
頭固いぞ

126:デフォルトの名無しさん
14/01/17 06:26:36.31
ロールバックがどうのといってるけど、たぶん質問の本質はそっちじゃないんだと思う

Q. withブロックを途中で抜けたい

こうでしょ?

A. 今のところbreakのような安直な方法はないので
自分でwhileやdefみたいなブロックを作ってください

127:デフォルトの名無しさん
14/01/17 06:33:10.03
あ、当然インデントが深くなります
インデントが深くなるのが嫌ならPythonは使わないことです

128:デフォルトの名無しさん
14/01/17 12:35:52.48
インデントが深くなるのを抑制する用途にも with は使えるよ。
2.6だと contextlib.nestedが必要かも知れないけど、with に複数のcontext managerを列挙できる。

>with を途中で抜ける

例外を使う。withの外に例外を伝えたくなければ、特定の例外を捕捉するcontext managerを併用する。

@contextlib.contextmanager
def pass_exc(*exc_types):
 try:
  yield
 except exc_types:
  pass

class BreakContext(Exception): pass

with pass_exc(BreakContext), con:
 raise BreakContext

129:128
14/01/17 12:46:21.22
sqlite3.Connectionの__exit__では、例外があったら rollback なければ commit を呼ぶので、
上の例では con を先にするか後にするかで、例外が伝わるかどうかが変わってくる点に注意が必要。

その辺の制御の流れは、少し判り辛いので、
望みの振る舞いをするトランザクションのcontext managerを書き下す方が良いかもしれない。

2.6のwhat's new や PEP343 にトランザクションのcontext managerの実装例が載ってます。

130:デフォルトの名無しさん
14/01/17 13:01:07.24
関数はwith の外に置けばインデント深くならないけど、
この場合、例外を使わずrollbackするには明示的に呼ぶ必要があり

def do_something(con):
 return con.rollback()

with con:
 do_something(con)

スマートさに欠ける点は、これだとwith抜けるときにcommit()も呼び出される。
rollback直後でinTransactionフラグがfalseになってるから、
データベースにCOMMITは発行されないけど。ここは commitメソッドの実装依存。

131:デフォルトの名無しさん
14/01/17 20:18:20.92
すみません。教えて下さい。
以下のように3つ関数があって、test1⇒test2⇒test3の順に処理を流したいのですが、
test1でえられたitemをtest2で使えるようにして、test2でえられたlistをtest3の処理の中で使用したいのですが
どういう風に記述したらいいでしょうか?初歩的ですみません..

def test1()
...
return item

def test2()
...
return list

def test3()
#

#実行
test1()
test2()
test3()

132:デフォルトの名無しさん
14/01/17 21:20:22.07
>>131

def test1()
...
return item

def test2(i)
...
return list

def test3(l)

i = test1()
l = test2(i)
test3(l)

133:デフォルトの名無しさん
14/01/17 21:26:22.71
>>132
神!ありがとうございます!

134:デフォルトの名無しさん
14/01/17 21:56:58.90
>>133
頑張ってくれ

135:デフォルトの名無しさん
14/01/17 22:46:20.73
関数型っぽいの
def add(n):
 return n+1

def multiply(n):
 return n*10

def divide(n):
 return n/2

num_list = [1,2,3]

added = map(add, num_list)
multiplied = map(multiply, added)
divided = map(divide, multiplied)

136:デフォルトの名無しさん
14/01/17 23:53:27.77
>>135
プロファイル取ってみればわかると思うけど、
Pythonで関数型っぽいコードは大抵、実行効率が良くないよ。

関数型の概念等はとても有用だけど。関数型の言語に比べると処理系の実装が適してない。
python流(?)に書いた方が保守もしやすく(Pythonでは)効率良い

[(x+1)*10/2 for x in [1,2,3]]

137:デフォルトの名無しさん
14/01/18 00:21:48.56
mapとかfilterを上手く使えるとちょっと世界が広がる感じがするよねw
いまだにreduceはピンとくる使いどころがわからないけど

138:デフォルトの名無しさん
14/01/18 01:03:26.08
>>137

reduce使った関数合成と、無理やり使ってみた感のある応用例書いてみた。興味あったら、どぞ。
ideone.com/vN8PuJ

reduceはリストを順に処理して、最終的にひとつの要素に収束するような処理に用いるのだけど、
Pythonでreduceを使う局面は、普通にforループの手続きで書いた方が良いよ。

139:デフォルトの名無しさん
14/01/18 02:48:09.02
Pythonでもreduceの結果は一つの要素に限らないんじゃないの?
原始帰納関数はすべてfold(reduce)で再実装できるというのがミソ

140:デフォルトの名無しさん
14/01/18 14:30:44.02
>>139
(Pythonの)reduce関数の実装を指してのことならyes
初期値を取れるから、foldのようにも使える。

141:デフォルトの名無しさん
14/01/19 02:50:12.78
今日の0時のdatetimeを取得したいのですがどうすればいいでしょうか?

142:デフォルトの名無しさん
14/01/19 03:30:12.94
スクリプト実行中に発生したエラー・例外をloggingでファイルに書き出したいです
検索するとだいたい以下のようなサンプルが出てきます
try:
 ここでエラー発生
except:
 logging.error(~~)

これだとtryでキャッチしている箇所でないとファイルに書き出せません
そうではなく、どこでエラーが起きても全てファイルに書き出すにはどうすればいいのでしょうか

143:デフォルトの名無しさん
14/01/19 03:44:05.51
全部tryにいれればいいじゃん(いいじゃん)

144:デフォルトの名無しさん
14/01/19 04:50:19.59
>>141

midnight = datetime.fromordinal(datetime.date.today().toordinal())

>>142

logging用途なら sys.excepthook はどう?

145:144
14/01/19 05:10:30.55
訂正 モジュール名忘れてた
datetime.fromordianl -> datetime.datetime.fromordinal

146:デフォルトの名無しさん
14/01/19 05:26:39.90
>>145
ありがとうございました。そのような便利メソッドがあることを知りませんでした。
ドキュメントを読みなおしてみます。

147:デフォルトの名無しさん
14/01/19 13:41:26.28
twitterのAPIを叩くためにpython-twitterを使ってみたんだけど、なぜかエラーが出まくりで、仕様変更で使えなくなってるメソッド
がいくつかある模様。
tweepyの方は使いやすいですか?

148:デフォルトの名無しさん
14/01/19 15:03:05.45
自分はGitHubからDLしたtweepy使ってbot作りました。

149:デフォルトの名無しさん
14/01/19 15:36:20.26
twython 使ってる

150:デフォルトの名無しさん
14/01/19 16:55:29.79
python-twitterをちゃんとドキュメントに載ってるように書いてるのにエラーが出るとかわけわからんw

151:デフォルトの名無しさん
14/01/19 17:42:13.41
解決する気ないんなら自分の日記に書いてくれ

152:デフォルトの名無しさん
14/01/19 19:47:59.94
PythonでCGI書いてるんだが迷宮入りしたプログラミングweb助け
スレリンク(news4vip板)


Python3って文字列Unicodeだけになったんだっけか
デフォルトのエンコーディングutf-8じゃないんじゃねえの

これとか参考になんね?

URLリンク(stackoverflow.com)


違和感

153:デフォルトの名無しさん
14/01/19 20:39:56.61
コード晒せるだけ晒せよって言わないのはなんかお約束でもあるんだろうか

154:デフォルトの名無しさん
14/01/19 20:51:17.88
unicodeとutf-8は違うよ

155:デフォルトの名無しさん
14/01/19 21:19:15.73
原因がはっきりしたようでめでたい

156:デフォルトの名無しさん
14/01/19 21:33:38.54
馬鹿には無理

157:デフォルトの名無しさん
14/01/19 22:10:15.58
2chはしょせん便所の落書き
自分の日記にも書けないようなことを書くとこだよ

158:デフォルトの名無しさん
14/01/20 00:00:05.16
自分には標準ストリームとかそのあたりの理解が足りないんだけど
そのあたりの知識ってどういうところで学んでるの?
書籍とか?

159:デフォルトの名無しさん
14/01/20 00:20:28.64
「ふつうのLinuxプログラミング入門」で覚えたけど、
Web上のLinuxやプログラミング言語のマニュアル読めば十分じゃないの

160:デフォルトの名無しさん
14/01/20 02:13:11.86
>>158
標準入出力(stdin,stdout)等の事?プロセスの開始や環境変数の伝播等
カテゴリ的には「システム・プログラミング」

「POSIX」という共通の規格があるけど、細かい部分ではOS依存になるので、
より深い所に関心があるなら、各OS毎の情報を調べる事になります。

Linuxだとman、WindowsだったらMSDNとかになるのかな。
この辺の情報は、書籍でも大抵はC言語になると思う。

161:デフォルトの名無しさん
14/01/20 17:35:18.99
あ”あ”あ”!!
Pythonの正規表現苛つく...
何なんだよ、コレ!?
ワケが分からん

162:デフォルトの名無しさん
14/01/20 17:40:18.82
無理しないで分相応なツール使ってればいいのに
背伸びしても疲れるだけだぜ

163:デフォルトの名無しさん
14/01/20 17:44:10.50
Pythonでテキストブラウザ作ってみようと思ったんだけど、
そもそもああいうのはHTMLを一旦読み取ってタグやらを除去してるのか?

164:デフォルトの名無しさん
14/01/20 17:55:50.83
いや宇宙のどこかからデータを引っ張ってきて表示するだけだよ

165:デフォルトの名無しさん
14/01/20 18:00:57.86
Pythonの正規表現は引数の順番が他の言語と違ってて時々間違えるけど
ワケ分からなくはないだろ

166:デフォルトの名無しさん
14/01/20 18:15:45.70
いや、俺の持ってるPythonの本とか全然詳しく書いてないから、
後方一致だとか、大文字小文字の無視とか訳が分からんかった
PHPのpreg_matchみたいな簡単なのあればいいのに
文法が気に喰わん
re.compile()した後にsearch()してgroup()して...とか
めんどくさい

167:デフォルトの名無しさん
14/01/20 18:17:25.84
>>163
パーサを作って、タグや属性等はイベント・ドリブンで処理してる。

168:デフォルトの名無しさん
14/01/20 18:19:12.38
>>163
mechanizeってライブラリで簡単にできる例えば
<div>あ</div> ← こういう文字列から"あ"だけを取り出すのとか
自分で正規表現かく必要すらない
でもPythonからmechanizeを扱うには日本語資料少なすぎて難しいかもしれない
rubyからmechanizeを扱うなら資料沢山あるのだけど

169:デフォルトの名無しさん
14/01/20 18:21:09.90
>>166
正規表現よく使うなら正規表現リテラルのある Ruby のほうが向いてるかも
あと Python は re.compile() するのが面倒なら re.search() とかモジュールメソッド呼んでも構わない

170:デフォルトの名無しさん
14/01/20 20:05:04.04
Pythonのreモジュールでデリミタ変更したいんだけど、どうすればいい?
シングルクォート、ダブルクォート以外にしたいんだけど
例えば、
pattern = r"正規表現"
r = re.compile(pattern)
m = r.search(str)
が一般的だと思う

171:デフォルトの名無しさん
14/01/20 20:27:29.51
r"..." は raw 文字列って言って文字列の一種
r"\n" は バックスラッシュと n の二文字に解釈される
正規表現のデリミタではないよ

172:デフォルトの名無しさん
14/01/20 20:42:39.09
r"\""
がめんどいから
r|"|
みたいに書けないかって話だと思う
perlやrubyの悪臭がするけど

173:デフォルトの名無しさん
14/01/20 20:54:00.40
三連クオートのRAW文字列使えばいいだろ pattern = r"""aaa"bbb"""
日本語ドキュメントあるんだし読めよ

174:デフォルトの名無しさん
14/01/20 20:57:02.69
PHP じゃないかなあと

175:デフォルトの名無しさん
14/01/20 21:52:12.29
>>172
そう、そういうこと
説明の仕方が悪かったね、ごめん

176:デフォルトの名無しさん
14/01/20 23:49:20.74
その文字列に、
〇〇以外の文字列が含まれているかどうかってのはどうやって判断すればいいの?
俺が馬鹿なのか全く思いつかない

177:デフォルトの名無しさん
14/01/20 23:58:23.09
〇〇の文字列を置換で除去した後に、何か残ってるか調べるのはどう

178:デフォルトの名無しさん
14/01/20 23:59:47.69
頭がいいと難しく考えすぎることがある。
アホは、○○を検索して見つからなかったら含まれていないと考えるw

179:デフォルトの名無しさん
14/01/21 00:31:58.54
単語単位なのか文字単位なのか、
重複する文字を許すかどうかで変わってくると思う。

"lolol".replace("lol", "") # 'ol'
re.sub(r"lol", "lolol", "") # ''
not re.match(r"^(AAA|BBB|CCC)+$", "CCCBBBAAAd") # True

180:179
14/01/21 00:33:53.50
ごめん、re.subの引数の順番間違えた
re.sub(r"lol", "", "lolol") # '' でした

181:デフォルトの名無しさん
14/01/21 11:16:29.47
Pythonの正規表現を本やWeb上で調べると、だいたい
e = re.compile(pattern)
r = e.search(str)
if r is None:
print("fuck you")
else:
i = 0
while i >= -:
m = e.search(str, i)
if m:
print m.group(1)
i = m.start() +1
と書いてる(後半は自分のやり方)

182:デフォルトの名無しさん
14/01/21 11:20:45.13
でも、あるサイトで
r = re.search(pattern, str, flags)
と書いてたんだけど、これでいけるの?
実際実行してみて上手くいったような気がするんだけど、
compileしなくてもいいのなら、連続で正規表現適用させる場合なんか、わざわざ冗長な上の書き方しなくて済むから楽だよね?
この下のやり方で問題のある時、デメリットってあるの?

183:デフォルトの名無しさん
14/01/21 11:44:47.68
>>180
>>> re.sub(r"lol", "", "lolol")
'ol'

184:デフォルトの名無しさん
14/01/21 12:51:19.13
>>182
コンパイル済み正規表現オブジェクトは、Python2では100個、Python3では512個キャッシュされるので
re.search使ったとしても、毎回コンパイルされるわけではない
詳しくは /Lib/re.py のソースコード参照

ループ中で同じ正規表現を何百万回も使う場合など・・・
キャッシュから取り出す処理時間すらも削りたい状況ではcompileを使うべき

速度を気にしないなら可読性の良いre.searchでおk
ただしre.searchには、検索範囲を指定する引数はない

185:デフォルトの名無しさん
14/01/21 13:45:16.38
ディクショナリの順番って何順になるの?

186:デフォルトの名無しさん
14/01/21 14:04:58.84
>>185
Pythonの実装依存
順番をそろえたいなら for k in sorted(dic.keys())

187:デフォルトの名無しさん
14/01/21 14:08:33.01
>>184
なるほど
教えてくれてありがと

188:デフォルトの名無しさん
14/01/21 15:26:29.05
py2.7 beautifulsoupでパースできなかった場合、
lに値が入らず下記エラーになります。
if (l == None): といった風に例外処理を書く事は出来るんでしょうか?
エラーで処理を止めずに、エラーが出た事を取得したいのですが・・
分かる方いらっしゃいましたら、お願い致します! f = open("test.html") s = BeautifulSoup(f) l = s.find("a")["href"] TypeError: 'NoneType' object has no attribute '__getitem__'

189:デフォルトの名無しさん
14/01/21 16:14:20.71
ごめん、また質問させて欲しいんだけど...
正規表現使用して、該当部分を表示するのではなく、
逆に削除して、その部分を抜いて表示したい場合どうすればいい?
>>181で言えば、m.start()やm.end()で該当部分が出てくるけど(例えば123-184)、
その部分を抜いて表示するというやり方しかないのかな?

190:181
14/01/21 16:30:30.41
訂正しとく
i = m.start()+1じゃダメだね
i = m.end()+1じゃないと
じゃないと重複が大量に出てきてしまうし、処理速度が極めて遅くなってきそう

191:デフォルトの名無しさん
14/01/21 16:44:36.99
>>189
置換したいのかな?

s = "ab2c45d67e8fg"
print(re.sub(r'\d+', '', s))

192:181
14/01/21 16:49:41.71
>>191
あ、そうか
俺バカだなぁ

str = str[0:m.start()-1] + str[result.end()+1:]
とかめんどくさいことしてた
ま、これでも出来ることは出来るんだけどね
どっちが処理速度が早いかは分からんけど
なんかPython触ってから他の言語で出来ることを複雑に考えすぎてるのか、混乱してるっぽい

とりあえず教えてくれてありがと

193:デフォルトの名無しさん
14/01/21 17:09:45.45
>>188
たぶんfindで見つからないときNoneが返るんでしょ?
a = s.find("a")
if a is None:
 print 'エラーです'
else:
 l = a["href"]

194:デフォルトの名無しさん
14/01/21 21:06:23.68
>>193
あー思い通りにいきました。ありがとうございます。

195:デフォルトの名無しさん
14/01/22 02:17:05.01
>>183 指摘thx 今度からtypoなくす為に、コピペにします

>>185
順序付辞書なら、collections モジュールに OrderedDict もあるよ。こちらは挿入順。

196:デフォルトの名無しさん
14/01/22 17:49:26.29
HELPです
関数内でループが適用されません
以下のスクリプトを行うと、urlやjavascriptがそれぞれ一つずつしか抽出されません
インデントも確認してみたんですが...

うpローダーにスクリプトをあげました
URLリンク(www.dotup.org)

関数にせずに、それぞれ素で適用させた場合は上手くいくのですが、
そのそれぞれの処理を関数に書いて適用させた際には、結果が一つしか出てきません
スコープなのかなぁ?
Pythonは良く分かりません

197: 忍法帖【Lv=3,xxxP】(2+0:5)
14/01/22 17:58:01.18
直リン貼れなかったので、ちょっと自分の忍法帖確認してみます
すみません

198:デフォルトの名無しさん
14/01/22 18:28:22.22
>>196-197
再現可能なサンプルデータぐらい用意したら?
URLじゃなくてそのまま食わせられるHTMLね
あと、ソース貼るならpastebin.com、codepad.org、ideone.comとかにしてくれ

199:デフォルトの名無しさん
14/01/22 18:31:28.15
>>196
チラっと見た感じだけど、正規表現パターンが原因でしょ
最初の pattern_url はいいが、残り2つは前後に .+ .* が付いてるから
1回で文字列全体にマッチして終了してしまうよ

200:デフォルトの名無しさん
14/01/22 18:33:26.13
他の言語ができるならテストを書きなされ

201:デフォルトの名無しさん
14/01/22 18:43:02.73
変に複雑な事してるけど、こんな感じでいいと思うけどなあ
results = []
for m in re.finditer(r'''\bhref=['"]?([^"<>\s]+)''', html, flags = re.I):
 results.append(m.group(1))
if uniq:
 results = list(set(results))

202:デフォルトの名無しさん
14/01/22 20:57:54.65
>>196
tagRemoveのre.subを繰り返し呼ぶようなコードだけど、
一度で全て置換されるのでループは不要。

re.subn使えば置換個数を確認できます。

203:デフォルトの名無しさん
14/01/22 21:47:35.69
>>196です
皆さん、色々とアドバイスありがとうございました

204:デフォルトの名無しさん
14/01/23 00:17:18.66
直リンク禁止されてるのでscheme部を省いてリンクします
コード : pastebin.com/7YqtR23Q

空白行が除去できないのですが、これは自分の正規表現の書き方が悪いからでしょうか?
それとも、pythonのコーディングが間違っているからでしょうか?
自分の結果では最初の20行は空白行が続き、21行目に" / "と言う文字が出てきます
その後はまた暫く空白行が続きます
これらの空白行を全部取り除きたいのですが...

もしかしたらこのような面倒くさいやり方ではなく、関数などの利用で一気に除去できるかもしれませんが
検索しても見当たりませんでした

アドバイス頂けないでしょうか?

205:デフォルトの名無しさん
14/01/23 00:36:54.08
Pythonの実行速度、たとえばfor文で何百万回も
ループを回すような処理が遅くて困っています。
リスト内包表記とかmap関数とかjoin関数とかで
極力高速化しているものの、Pure Pythonでは
頭打ちの状態です。
CPythonやCython、PyPyなど、実装側で高速化する
方法を検討していますが、これといった決め手に
欠けています。

主な用途はNumPyを併用した科学計算や
データの整形など、数値計算寄りです。
サーバアプリのような規模の大きいものではなく、
単一のスクリプトファイルを必要な時に叩くといった
やり方がほとんどです。
sys、os、subprocess、numpyは必須。
できればscipyやmultiprocessingも使いたいです。
Mac/Win/Linuxいずれの環境でも実行できる必要が
あります。
そして互換性や可読性の都合上、各実装に特化した
コーディングは極力避けたいです。
各実装の得手不得手など、ざっくりとした内容で
結構ですのでご意見いただけませんでしょうか?

206:デフォルトの名無しさん
14/01/23 01:14:19.47
そこまでやるなら素直にRubyへ移行したほうが良いです。
そのままゴリ押ししても良いことないです。

207:デフォルトの名無しさん
14/01/23 01:16:49.69
>>204
正規表現を勉強する
検索ではなく公式のチュートリアルと標準ライブラリにざっと目を通す
2 タブをやめる

208:デフォルトの名無しさん
14/01/23 01:51:16.12
>>205
cで書け

209:デフォルトの名無しさん
14/01/23 02:17:47.09
>>205
Cythonで十分だろう
なにが不満なんだ

210:デフォルトの名無しさん
14/01/23 02:39:36.29
>>205
つanaconda accelerate

211:デフォルトの名無しさん
14/01/23 03:12:36.80
>>205
PyPyは確かにCPythonより計算とか速いこともあるけど一長一短でそれだけな感が
Cythonは型指定でC/C++に迫れるけどそもそもCに変換してコンパイルしてるので
C/C++で書いたらいいじゃない感、PurePythonコーディングでなければ互換性がないのも…

numpy前提なら小手先のマルチプロセスより
pyopenclでも使ったほうが次元の違うレベルになるんじゃないかな

212:デフォルトの名無しさん
14/01/23 04:28:10.51
>>204
ここで質問したのはもう終わりにするの?

Regular Expression(正規表現) Part12
スレリンク(tech板:234番)

213:デフォルトの名無しさん
14/01/23 06:54:13.07
>>204
空白行を取り除く

print("\n".join(x for x in html.splitlines() if x))

214:デフォルトの名無しさん
14/01/23 06:56:06.28
PyPyは注意書きにあるようにPurePythonじゃないとエミュレーションで遅くなるし
俺は速度が必要な時はCython/Cだね
Cで書いてCythonでGILを開放しつつ糊付け
あとはスレッド作って回す


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch