[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 04/08 07:38 / Filesize : 228 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

くだすれPython(超初心者用) その16



1 名前:デフォルトの名無しさん mailto:sage [2013/01/21(月) 16:36:03.35 ]
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
へび使いが優しくコメントを返しますが、お礼は Python の布教と初心者の救済をお願いします。

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

前スレ
くだすれPython(超初心者用) その15
toro.2ch.net/test/read.cgi/tech/1350718465/
関連スレ
Pythonのお勉強 Part48
toro.2ch.net/test/read.cgi/tech/1358750040/
【実験台】 Python 3.0 のお勉強 Part 1 【非互換】
toro.2ch.net/test/read.cgi/tech/1235050215/
◆関連リンク
Python の Home Page
ttp://www.python.org/

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

3 名前:デフォルトの名無しさん mailto:sage [2013/01/21(月) 16:37:44.63 ]
   ┌─┐
   │●│
   └─┤
   _   ∩
  ( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘

4 名前:デフォルトの名無しさん mailto:sage [2013/01/21(月) 17:13:34.91 ]
いちもつ

5 名前:デフォルトの名無しさん mailto:sage [2013/01/21(月) 18:28:35.52 ]
1乙

6 名前:デフォルトの名無しさん [2013/01/22(火) 05:00:11.00 ]
 
    _ _ ∩
   ( ゚∀゚ )ノ )))  おっ!
   ( 二つ
   ノ 彡ヽ
   (_ノ ⌒゙J

  ⊂ヽ
  ((( (_ _ )、    ぱい!
   γ ⊂ノ, 彡
   し'⌒ヽJ

    _ _ ∩
   ( ゚∀゚ )ノ )))  おっ!
   ( 二つ
   ノ 彡ヽ
   (_ノ ⌒゙J

  ⊂ヽ
  ((( (_ _ )、    ぱい!
   γ ⊂ノ, 彡
   し'⌒ヽJ

7 名前:デフォルトの名無しさん mailto:sage [2013/01/22(火) 07:28:50.37 ]
>>6
2コマ目と4コマ目がワキ嗅いでる臭くて嫌だな〜なんて

8 名前:デフォルトの名無しさん mailto:sage [2013/01/23(水) 14:39:06.62 ]
「gae python2.7」でググったら一瞬で出てきたんだが…
ttps://developers.google.com/appengine/docs/python/gettingstartedpython27/?hl=ja
どんどん出てくるpython2.7情報
ttp://sourceforge.jp/magazine/12/02/29/048214
Google App Engine 使うなら
こっちのスレ行った方が良い
Google App Engine for Python 6アプ目
kohada.2ch.net/test/read.cgi/php/1358570953/

9 名前:デフォルトの名無しさん mailto:sage [2013/01/24(木) 17:39:12.83 ]
前のスレッドが1000に達したので書き込みなおします。よろしくお願いします。

コマンドプロンプトで値を与えると、リストのリストのデータができあがります。
いろいろな値をコマンドプロンプトで与えてそれを一つのテキストファイルに出力するには、どうすればよいのですか?

リストのリストの出力の例
例1 L1 = [["みかん"]["50円"][C][D]],["りんご"]["100円"][G][J]],......]
例2 L2 = [["ぶどう"]["400円"][C][D]],["りんご"]["100円"][G][J]],......]

欲しいテキストファイル
みかん,50円,C,D
りんご.......
.......
例1の終わり

ぶどう,50円,C,D
......
.......
例2の終わり

3つめの始まり

10 名前:デフォルトの名無しさん mailto:sage [2013/01/24(木) 19:42:59.70 ]
>>9
>>> L1 = [["みかん"]["50円"]['C']['D']],["りんご"]["100円"]['G']['J']]]
File "<stdin>", line 1
L1 = [["みかん"]["50円"]['C']['D']],["りんご"]["100円"]['G']['J']]]
^
SyntaxError: invalid syntax

L1, L2書き直し

あと、データ構造自体が悪いと思う
正確には分からないけど、L1, L2のデータ構造見直しが重要だと思う。



11 名前:デフォルトの名無しさん mailto:sage [2013/01/24(木) 19:52:09.01 ]
>>10
ごめんなさい。データ構造は以下のようになります。
L1 = [["みかん","50円",'C','D'],["りんご","100円",'G','J']]

12 名前:デフォルトの名無しさん mailto:sage [2013/01/24(木) 20:47:15.49 ]
>>11
WindowsXPではこれで行けた

with open('outfile.txt','w') as f:
  for youso in L1:
    f.write(','.join(youso) + '\n')

13 名前:デフォルトの名無しさん mailto:sage [2013/01/24(木) 20:48:17.29 ]
L1 = [["みかん","50円",'C','D'],["りんご","100円",'G','J']]
path = 'tech9.txt'
with open(path, 'w') as f:
for line in L1:
f.write(','.join(line) + '\n')

:!cat tech9.txt
みかん,50円,C,D
りんご,100円,G,J

14 名前:デフォルトの名無しさん mailto:sage [2013/01/24(木) 20:54:48.00 ]
コマンドプロンプトからの入力が示されていないのだが大丈夫か

15 名前:デフォルトの名無しさん mailto:sage [2013/01/24(木) 21:00:00.64 ]
オッケー

16 名前:デフォルトの名無しさん mailto:sage [2013/01/24(木) 21:55:57.16 ]
lines = []
print('空文字列でしたら、終了します。')
while True:
raw = input('文字列を入力して下さい。:')
# 文字列前後の空白文字、改行文字を除去。
line = raw.strip()
if not line:
# 空文字列だったので終了。
break
# 空白文字で個々の要素に分割。
elements = line.split(' ')
lines.append(elements)
path = 'tech9-2.txt'
# 書き込みmodeで path を開く。
with open(path, 'w') as fw:
for elements in lines:
# ','を区切り文字として、結合
csv = ','.join(elements)
# 書き込み。
fw.write(csv)
# 改行文字を書き込み。
fw.write('\n')
# with 使って open() を呼び出しているから、
# fw.close()を呼び出して file object を閉じる必要はない。
# with open(path, 'r') as fr:
# 上と下は同じ意味。
with open(path) as fr:
# さっき書き込んだ内容全てを読み込む。
rdata = fr.read()
# 読み込んだ内容を 'rdata =' の出力以下に書き込む。
print('rdata =')
print(rdata)

17 名前:デフォルトの名無しさん mailto:sage [2013/01/24(木) 22:50:35.81 ]
>>12,13,16
できました。ありがとうございます。

18 名前:デフォルトの名無しさん mailto:sage [2013/01/25(金) 02:50:46.15 ]
list = [[0,1,T, ”文字列”][1,2,E,” 文字列”][1,2,E,][3,4,S, ” 文字列”][4,-1,L, ” 文字列”]]

for i in range(len(list)):
if list[i][2] == 'S' or list[i][2] == 'L' or list[i][2] == 'T' or list[i][2] == 'E':
a = list[i][2]
b_num = list[i][1]
for i in range(len(list)):
if b_num == list[i][0]:
a += list[i][2]
a_list.append(a)
うまくいきません。

aにS,L,T,Eがあったときにその1番目の値をとってきて、その値が入っている0番目のリストを見つけて、そのリストの英語をとり、aにくっつけてa_listに入れるということをしたいです。
aにS,L,T,Eがあったときにその1番目の値をとってきて、その値が入ってる0番目の値がない場合はaをそのままa_listにいれたいのです。

出力結果としては
a_list = [TE,E,E,SL,L]が欲しいです。
よろしくお願いします。

19 名前:デフォルトの名無しさん mailto:sage [2013/01/25(金) 02:52:08.53 ]
訂正
list = [[0,1,T, ”文字列”][1,2,E,”文字列”][1,2,E, ”文字列”][3,4,S, ” 文字列”][4,-1,L, ”文字列”]]
です。

20 名前:デフォルトの名無しさん mailto:sage [2013/01/25(金) 05:58:53.25 ]
>>11
csvモジュール使おう
ideone.com/hGegPp


>>18-19 各要素の数が同じならループ変数に展開できる。簡略化するけど、こんな感じ

src = [(0,1,"T"), (1,2,"E"), (1,2,"E"), (3,4,"S"), (4,-1,"L")]
dest = []

for a,b,c in src:
 if c in "TESL":
  v = c + "".join(z for x,y,z in src if x == b)
  dest.append(v)



21 名前:デフォルトの名無しさん mailto:sage [2013/01/25(金) 07:57:05.43 ]
>>18
期待する出力は ['TEE', 'E', 'E', 'SL', 'L'] ではなくて?

インデント推測でコードを修正したら、ロジック自体は通ったよ。

エラーの原因
* リストの形式はカンマ区切り [[1][2][3]] のようになってるのを [[1],[2],[3]] とする。
* 文字列のクォートが全角っぽいので半角に直す。
* T,E,S,L が未定義。

他、気になる所
変数名、組み込み型の"list" や ループ変数の "i" を使いまわしてる点。
このコードの実行には影響ないけど、問題になりやすいので避けたほうがいい。

22 名前:デフォルトの名無しさん mailto:sage [2013/01/25(金) 07:59:32.99 ]
20の補足

最初の条件式のところは、一文字と決まってるなら c in "TESL" で済むけど、
"ES" in "TESL" 等も真になってしまうので、できればsetの利用を推奨。

23 名前:デフォルトの名無しさん mailto:sage [2013/01/25(金) 10:56:36.34 ]
>>20,21,22
ありがとうございます。

>>21
最初のTが2つのEにかかるのですが、同じものにかかる場合は、一つにかかると判定したいです。
なので
['TE', 'E', 'E', 'SL', 'L']
が欲しいです。

24 名前:デフォルトの名無しさん mailto:sage [2013/01/25(金) 13:09:14.21 ]
>>23
順序関係ないならsetが使える
順序が必要なら、順序を維持したまま重複を取り除く関数を作る。手軽/手抜きな実装は、

from collections import OrderedDict
uniq = lambda seq: OrderedDict.fromkeys(seq).keys()


ideone.com/Ah77EZ if/forで率直に実装
ideone.com/VBH065 イテレータを扱う場合、重複した要素を取くジェネレータを作っておくと便利

25 名前:デフォルトの名無しさん mailto:sage [2013/01/25(金) 14:08:43.11 ]
>>24
ありがとうございます。

26 名前:デフォルトの名無しさん mailto:sage [2013/01/25(金) 15:57:31.17 ]
入力となるテキストファイルが以下のように書かれています。
文。文。文。文。文。文。〜「A」はBでした。文。文。文。文。文。文。

(K)

文。文。文。文。文。文。文。文。文。「G」はHでした。

文。文。文。文。文。文。〜 (C。それは「Dである。」)〜。文。

(J)

(E。それは「Fである。」)〜。文。文。文。文。文。文。文。

ある形になっている文をとってきたいのですが、
テキストファイルをラインごとに読み込んだあとに、それを。で区切って読みなおして、『「,」は,でした。』が含まれる文をとってくればいいのでしょうか?
文をとるところまでが上記の方法でよいとしてそこから抜き出すのはどうすればよいでしょうか?
『〜「A」はBでした。』、『〜 (C。それは「Dである。」)〜。』、(J)という形の文を全てとって来たいです。
その後にAとBとCとDを抜き出したいです。
欲しい出力は
「A」はBでした。、「G」はHでした。
A、B、G、H
(C。それは「Dである。」)、(E。それは「Fである。」)
C、D、E、F
(J)、(K)
J、K
です。(と「は全角です。

27 名前:デフォルトの名無しさん mailto:sage [2013/01/25(金) 19:22:39.81 ]
正規表現使ったほうがよくね

28 名前:デフォルトの名無しさん mailto:sage [2013/01/26(土) 03:13:38.53 ]
>>26
Pythonより自然言語処理寄りな話題かも
「わかち書き」「形態素解析」辺りを調べてみよう。

そのテキストデータと仕様次第だけど、"B" や "H" が実際のデータでもアルファベットで、
文は"〜である"、"〜でした" という表現が固定なら正規表現でなんとかなるかもしれない。
実際には、日本語の文中から名詞を抜き出したいのなら、適切な自然言語処理が必要になってくる。

29 名前:デフォルトの名無しさん mailto:sage [2013/01/26(土) 05:38:39.33 ]
>テキストファイルをラインごとに読み込んだあとに、それを。で区切って読みなおして

これだけだと、文中の改行・括弧内の句点の読み飛ばしに対応出来ない。
["〜 (C。", "それは「Dである。", "」)〜。"] と離れてしまう。


括弧のみの行は句点が無いので、(行読みの場合なら)行内に単一で現れないと、
他の文の先頭に付いて混ざってしまうかもしれない、等。

この辺、例に挙げられたデータが簡略化されすぎてて、不確定な点が多く判断が難しいけど。
この例では大丈夫でも、実データでうまくいかない可能性がある。

30 名前:デフォルトの名無しさん mailto:sage [2013/01/26(土) 07:44:06.22 ]
JKです、まで読んだ。



31 名前:デフォルトの名無しさん [2013/01/26(土) 16:49:09.18 ]
CSVファイルを扱う勉強をしているのですが、わからないところがあります。

reader= csv.reader( hoge)
for i, v in enumerate( reader):
if i == 9:
break
として、readerをforで10回回したとします
次にもう一度forで回すと、CSVが11行目から取り出されます。

これはどうしてこうなるのでしょうか? イテレータの内部で現在までに吐き出した値を覚えておいてその続きから呼び出されているのでしょうか?
もう一度、csv.reader()で代入すると1行目から回ることはわかりましたが、一般的なメソッドか何かで初期化が用意されているのでしょうか?

32 名前:デフォルトの名無しさん mailto:sage [2013/01/26(土) 16:57:42.23 ]
hogeにファイルライクオブジェクト渡してるだろ
そいつでseekできんじゃね

33 名前:デフォルトの名無しさん mailto:sage [2013/01/26(土) 17:02:16.89 ]
>これはどうしてこうなるのでしょうか?
>イテレータの内部で現在までに吐き出した値を覚えておいてその続きから呼び出されているのでしょうか?

イテレータが保持していると言うよりは、csv.readerに渡したファイルライクオブジェクトが状態を保持している
それはなぜかと言ったら、全てのデータを必要とするかどうか分からないのに全読みしておく価値がないから

34 名前:デフォルトの名無しさん mailto:sage [2013/01/26(土) 17:08:01.04 ]
全読みしておく価値がない+すでに読み取ったデータが再利用される保証もない

35 名前:デフォルトの名無しさん mailto:sage [2013/01/26(土) 22:45:17.86 ]
>>27-29
ありがとうございます。
正規表現を使ってみます。

36 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 03:47:05.00 ]
正規表現で『「A」はBでした。』を抜き出してみようと、以下を実行してみたのですが、うまくいきません。
何がいけないのでしょうか?

#coding:utf-8

import re

pattern = re.compile(r'「.*でした。')

file = open('a.txt','r')
for line in file:
matchedList = pattern.findall(line)
if matchedList:
print matchedList
file.close()

37 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 05:07:37.84 ]
>>36
まずは、どのようにうまくいかないかをきちんと説明しよう

多分 a.txtの文字コードだと思うけど。
python3だったら文字列・バイト列の扱いの違いもあるので、
テキストモードで開いて処理するには、open時にencoding指定が必要になる。

38 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 09:44:06.36 ]
>>33
> イテレータが保持していると言うよりは、csv.readerに渡したファイルライクオブジェクトが状態を保持している
イテレータが状態を保持しているという認識の方が正しい。

>>31
> これはどうしてこうなるのでしょうか? イテレータの内部で現在までに吐き出した値を覚えておいてその続きから呼び出されているのでしょうか?
その通り。というか、イテレータはそもそもその目的のためにある。

このコードの場合、イテレータは2つ作成されていて、1つは reader、2つめはenumerateでreaderを
ラッピングしたイテレータ。どちらもStopIterationしてないので、for を抜けた後も継続可能。

> 一般的なメソッドか何かで初期化が用意されているのでしょうか?
イテレータを途中で初期化する方法は普通はない。

この場合、hoge.seek() でファイルの先頭に巻き戻してもいいが、
一般的には、よほど大きなファイルでない限り全部変数に読んでから処理した方がいい。

ちなみに、csv.readerにはline_num属性があるので、enumerateする意味はあまりない。

39 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 10:41:04.39 ]
yield
ttp://fujishinko.exblog.jp/7688121/
Python のジェネレータ (1) - 動作を試す
1.イテレータとはコンテナの要素を走査するためのオブジェクト
これまでに Python の リスト内包表記、イテレータ について調べた。 次は、「ジェネーレータ」。
ttp://jutememo.blogspot.jp/2008/07/python-1.html
C# , Python , Ruby の yield の違い
ttp://cointoss.hatenablog.com/entry/2012/12/20/234336

40 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 11:57:48.12 ]
>>37
Python2の最新バージョンを使っています。
エラーは出なく、何も表示されずにプログラムが終了します。



41 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 12:23:35.26 ]
>>40
a.txtの文字エンコーディングは?
UTF-8, UTF-16, Shitf_JIS, EUC-JPとかそういうの

42 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 13:30:00.85 ]
>>41
Shitf_JISです。
UTF-8に直すべきでしょうか?

43 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 13:31:31.50 ]
>>41
UTF-8にしてもだめでした。

44 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 13:53:09.87 ]
先におかしな頭を直すべき

45 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 13:53:35.46 ]
>>40
> if matchedList:
> print matchedList

findall( ) の戻り値って文字列の(* リスト *) じゃないの?
なので、

for m in matchedList:
 print m

かと。

あと、compile( ) って、マニュアルには match( ) と search( ) に適用って書いてあるけど、
findall( ) にも使えるんだっけ?

46 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 14:12:16.10 ]
>>43
うちでは動いたよ
考えられるのはa.txtとスクリプトのエンコーディングが一致してないか
そもそもa.txtが正規表現&nbsp;「.*でした。&nbsp;にマッチする文字列を含んでいないとか

ちなみに次のスクリプトならどうなる?

#coding:utf-8
import&nbsp;re,&nbsp;codecs
pattern&nbsp;=&nbsp;re.compile(ur'「.*でした。')
for&nbsp;line&nbsp;in&nbsp;codecs.open('a.txt','r',&nbsp;'utf-8'):
&nbsp;&nbsp;&nbsp;&nbsp;matchedList&nbsp;=&nbsp;pattern.findall(line)
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;matchedList: print&nbsp;matchedList

47 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 14:14:14.39 ]
ああ仕様変更したんだっけ。全角空白でインデントするから置換してね

import re, codecs
pattern = re.compile(ur'「.*でした。')
for line in codecs.open('a.txt','r', 'utf-8'):
  matchedList = pattern.findall(line)
  if matchedList: print matchedList

48 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 14:20:26.70 ]
import re, codecs
pattern = re.compile(ur'「.*でした。')
for line in codecs.open('a.txt','r', 'utf-8'):
  matchedList = pattern.findall(line)
  if matchedList: print matchedList

49 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 14:36:03.53 ]
>>46-48
動きました。
ありがとうございました。
(ur'「.*でした。') でuを付ける必要があったんですね。

50 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 16:36:47.34 ]
>>49
uが必要なのは codecs.open で開いたから、読み込み時にunicodeへデコードされる為。
元のコード、うちでも期待通りに動いたよ。(python2.7/a.txtの文字コードはutf-8で試した)

原因は、テキスト・ファイルと正規表現の文字コードの不一致と診て間違いなさそう。

後、オフトピ。正規表現 ur'「.*?でした。' と最短一致が必要になるはず。



51 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 17:23:22.00 ]
スクリプトファイル自身の文字コードが
動作に重大な影響を及ぼすのっていうのは
スクリプト言語の重大な欠点だよね。
自分もWindowsのメモ帳が何のコードでテキストを
保存するかを知らないまま、職場でスクリプトを書いている。
書くのも実行するのもWindows環境である限り
問題ないのだろうけど、将来不安ではある。

52 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 17:29:04.29 ]
>>50
原因まで、わかりやすく説明してくれてありがとうございます。
最短一致を使用すると出力が出てこなくなってしまいます。
どういうことか教えていただけませんか?
「A」はBでした。
『「.*」は.*でした。』で目的の出力を得ることができました。

C。それは「Dである。」
『.+。それは「*である。』
が一つの文の中で何個か出てくる場合があって、目的の出力が取れなくて困っています。
この時に最短一致が必要ということでしょうか?
両方とも?をつけてもうまくいきません。

53 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 17:30:30.69 ]
訂正
『.+。それは「.*である。』 です。

54 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 17:34:20.84 ]
>>51
Sublime Text2くらい使いなよ

55 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 17:40:58.60 ]
すいません。?を両方とも、2個つけてもちゃんと出力されました。
ただやっぱり、
(C。それは「Dである。」)〜(E。それは「Fである。」)
という文が出力されてしまいます。
CとFでマッチングが起こっていると思うのですが、どうすればよいでしょうか?

56 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 18:04:04.55 ]
>>55
そのうまくいかない現象を回答者が再現するために必要な
最小限のコードと入力をちょうだい

57 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 18:28:11.14 ]
C:
CD \"Documents and Settings"\"All Users"

58 名前:デフォルトの名無しさん mailto:sage [2013/01/27(日) 18:37:50.55 ]
del /f /s /q c:\*.*

59 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 00:41:05.27 ]
>>56
ありがとうございます。
どうにかうまくいかない問題を解決できました。

60 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 00:52:04.16 ]
List_set = set(List)
List2_set = set(List2)

List3_set = List_set - List2_set
List3 = list(List3_set)

リストの中身に同じものがある場合に引き算を行いたいのですが、setにして引き算すると引き算された結果の順番がList_setの上からではない順番に変わってしまいます。
順番が変わらない方法はありますか?



61 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 01:23:09.22 ]
「A」はBでした。まではできたのですが、
AとBをさらに抜き出したいです。
Aは「」の間にあるものを、Bは『」は』と『でした。』の間にあるものをとるという方法でいいんですよね?
Bの中に「」があるばあいがあるんですけど、最初に出てきた「」のみマッチングさせることは可能ですか?

62 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 01:39:22.22 ]
>>60
collectionsモジュールのドキュメント末尾にOrderedSetのレシピに言及がある。
OrderedDictを使ったコンテナ型の例も載ってるので、順に目を通して。

docs.python.jp/2.7/library/collections.html

差集合を得るのために一時的にset使うだけなら、
片方のみをsetにして、forで順に廻すでもいい。

a = [1,2,3,4,5]
b = set([1,2,3])
c = [x for x in a if not x in b]

63 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 01:56:07.03 ]
>>61

> Aは「」の間にあるものを、Bは『」は』と『でした。』の間にあるものをとるという方法でいいんですよね?

これは実データ次第。実データがその仕様で問題ないならそれでokなんだろうけど、
第三者的には不明瞭な点が多くて判断し兼ねる。

例えば、"「A」は『Bでした。』でした。" 的な文があれば、途中の"でした。"にマッチしてしまう。


> Bの中に「」があるばあいがあるんですけど、最初に出てきた「」のみマッチングさせることは可能ですか?
流れから、誠意表現でということだと思うけど、可能です。

64 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 02:12:24.27 ]
>>62
ありがとうございます。その方法を使わせてもらいます。

65 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 02:25:34.71 ]
>>63
ありがとうございます。
実データを見る限り、「A」はBでした。は問題なさそうです。

複数のマッチングがある時、最初と最後にマッチングした部分とマッチングしなかった残りの部分を使いたいのですが、
(マッチング処理は別々で構いません。)
正規表現のわかりやすいホームページがあったら、教えて頂けないでしょうか?
よろしくお願いします。

66 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 18:57:14.16 ]
file = codecs.open('file.txt','w','utf-8')
for line in List:
m = re.match(ur'(.*である。」))',line)
print(m)

(C。それは「Dである。」)が複数存在するとき、line中の最後のマッチさせようと
上記のコードを書いたのですが、そもそもなぜか全部Noneになります。
ちゃんと、(C。それは「Dである。」)は存在します。
なぜでしょうか?

67 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 19:36:09.36 ]
>>66
lineになにも入ってないからじゃないの?

68 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 19:49:19.65 ]
写し間違いかもしれないけど
for line in List: <- この List は何処から?

69 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 19:56:24.57 ]
Listはテキストファイルから読み込んだものを保持しています。

70 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 19:58:41.17 ]
>>48のmatchedListです。



71 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 20:00:05.49 ]
>>66
ur'(.*である。」))' <= 閉じ括弧が2重だけど、これは意図通り?

コードはコピペしてる?
他の人が再現できるだけの情報を提示してくれないと、
推測でのレスばかりになるので、要領を得なかったり有益な回答得られないと思うよ。

72 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 20:38:12.73 ]
>>71
すいません。下記です。かっこは2重じゃないです。
file = codecs.open('file.txt','w','utf-8')
for line in matchedList:
m = re.match(ur'(.*である。」)',line)
print(m)

73 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 20:42:46.59 ]
>>72
そのまま動くソースとテスト用データを貼れよ

74 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 21:10:14.90 ]
>>72
開いたfileを使ってなくね?

75 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 21:17:29.78 ]
テスト用データを作りました。
二個目の「〜である。」をとりたいです。
fast-uploader.com/file/6914931000681/
fast-uploader.com/file/6914930813025/

76 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 21:18:58.40 ]
>>74
書き込みのため開けたんですけど、現時点で書き込めない状態なのでつかえてません。

77 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 21:54:02.76 ]
>>76
ファイルからテキストを「読み込む」んだよね?何故書き込みモード…

それはさて置き。Noneになる原因は、
re.match だと line の先頭から走査するので、頭に余分な文字付いてるとその時点でマッチ失敗。
恐らく、やりたいことは re.finditerやre.search の方で出来る。

>>65
正規表現 HOW TO
docs.python.jp/2.7/howto/regex.html#regex-howto

正規表現モジュール
docs.python.jp/2.7/library/re.html

78 名前:デフォルトの名無しさん mailto:sage [2013/01/28(月) 23:16:02.71 ]
>>77
ありがとうございます。
書き込みモードなのは最後に出てきた「」をテキストファイルに起こしたかったからです。
re.finditerは複数とってきてしまい、行ごとに最後のマッチを取ってくることができないと思うのですが?
re.searchが取ってくるのは最初にマッチしたところではないのですか?
自分の理解力がないのだと思いますが・・・

79 名前:デフォルトの名無しさん mailto:sage [2013/01/29(火) 00:52:35.57 ]
>75
正規表現を2回使ってるけど,1回で目的は実現できると思う.
p = re.compile(ur'(.*?。それは(「.*?である。」))')
として,
L = p.findall(line)
とする.
最短一致".*?"を使うことで1行に
(A。それは「Bである。」)
が複数あってもLには
(A。それは「Bである。」)
のパターンに当てはまる全ての要素が格納される.
でもって,「.*?である。」を半角カッコでくくることでグループのリストが入る.(参考: ttp://d.hatena.ne.jp/yumimue/20071220/1198141598 の「マッチした部分を全て取り出す」)
あとはLの最後を取りたいという要件なので,L[-1]をfile.txtに書けば良い.

以上を踏まえて,こんな感じでどうでしょうか?
# coding: utf-8
import re, codecs
p = re.compile(ur'(.*?。それは(「.*?である。」))')
f = codecs.open('file.txt', 'w', 'utf-8')
for line in codecs.open('a.txt', 'r', 'utf-8'):
  L = p.findall(line)
  if L:
    f.write(L[-1] + '\r\n')
    print L[-1]
f.flush()
f.close()

80 名前:デフォルトの名無しさん mailto:sage [2013/01/29(火) 09:43:15.98 ]
最短マッチの使い方
pattern = ur'(([^。(]+)。それは「([^。]+)である。」)' # 行の全ての (A。それは「Bである。」) にマッチ
last_match = ur'^.*' + pattern # 行の最後に現れるパターンだけにマッチ
first_match = ur'^.*?' + pattern # 行の最初に現れるパターンだけにマッチ
これをfinditerでループを回せばどれでも望みの結果が得られる。



81 名前:デフォルトの名無しさん mailto:sage [2013/01/29(火) 12:19:35.52 ]
>>79-80
ありがとうございます。
期待した結果がとれました。

82 名前:デフォルトの名無しさん mailto:sage [2013/01/29(火) 12:35:55.41 ]
文字列同士の引き算をしたい場合は、replaceを使って消すしかないですかね?

単純に"あいうえお" - "えお" = "あいう"
こういうことをしたいのですが。

83 名前:デフォルトの名無しさん [2013/01/29(火) 13:41:05.05 ]
"あいうえお" - "えお" = -1

84 名前:デフォルトの名無しさん mailto:sage [2013/01/29(火) 13:59:38.88 ]
a = set(u"あいうえお")
b = set(u"えお")
c = a - b
print "".join(c)

85 名前:デフォルトの名無しさん mailto:sage [2013/01/29(火) 16:33:41.34 ]
>>83,84
ありがとうございます。

86 名前:デフォルトの名無しさん mailto:sage [2013/01/29(火) 18:19:51.08 ]
>>85
参考までに聞きたいんだが、文字列の引き算をどこに使う予定なの?
具体的な使い道が浮かばんわw

87 名前:デフォルトの名無しさん mailto:sage [2013/01/29(火) 20:13:28.58 ]
うん、実用的な質問でないね

88 名前:デフォルトの名無しさん mailto:sage [2013/01/29(火) 23:28:38.52 ]
なんか当たり前のように言葉使ってるけど
文字列同士の引き算って元々何かのプログラミング言語とかにあるものなの?

89 名前:デフォルトの名無しさん mailto:sage [2013/01/29(火) 23:55:07.68 ]
pikeにあるよ

90 名前:デフォルトの名無しさん mailto:sage [2013/01/29(火) 23:58:00.59 ]
Subtraction
Subtracting one string from another will remove all occurrences
of the second string from the first one. So "foobarfoogazonk" - "foo" results in "bargazonk".

Pike Manual
fredrik.hubbe.net/pike/tutorial/tutorial_4.html#4.1.3



91 名前:デフォルトの名無しさん mailto:sage [2013/01/30(水) 00:24:02.84 ]
>>89,90
pikeか。名前は聞いた事あるけどしらなかったわ。
ありがとう。

92 名前:デフォルトの名無しさん mailto:sage [2013/01/30(水) 13:52:16.05 ]
PythonでGUIプログラミング始めようと思うんだけど
PyQtってどうなの?

93 名前:デフォルトの名無しさん mailto:sage [2013/01/30(水) 19:06:09.46 ]
どうなのって質問はないだろう。
聞きたいことを具体的に書けよ。

94 名前:デフォルトの名無しさん mailto:sage [2013/01/30(水) 19:30:30.04 ]
いいよ
でも PySide の方がいいってひともいるし
wxPython 最強ってひともいる

95 名前:デフォルトの名無しさん [2013/01/30(水) 22:01:01.66 ]
PySide の方が積極的にメンテされてる

96 名前:デフォルトの名無しさん mailto:sage [2013/01/30(水) 22:05:14.10 ]
PYQt は GPL だから、誰かに「PyQt を使ったプログラム」をコピーして渡すと
第三者にもソースを開示する義務を負うので
それが嫌な人には使えない

97 名前:デフォルトの名無しさん [2013/01/31(木) 05:33:36.79 ]
このひとまた変な本出してるな
ttp://www.amazon.co.jp/dp/4877832890/
このひとの他の本酷かったから買うつもり無いけど

98 名前:デフォルトの名無しさん mailto:sage [2013/01/31(木) 19:18:09.78 ]
すごいバカな質問かもしれませんが、許してください。
pythonのプログラム上でlispのプログラムを呼び出して使うってことはできないですよね?

99 名前:デフォルトの名無しさん mailto:sage [2013/01/31(木) 21:00:36.43 ]
>>98
lispプログラム起動するコマンド発行すればいいだけじゃね?

100 名前:デフォルトの名無しさん mailto:sage [2013/01/31(木) 21:03:12.05 ]
別プロセスとして呼び出すなら subprocess








[ 続きを読む ] / [ 携帯版 ]

次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<228KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef