🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1082閲覧

List処理にて、わからない条件がある

Fur0

総合スコア48

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/27 00:44

編集2021/01/27 01:23

前提・実現したいこと

前任者からの引継ぎでいただいたPythonnソースを理解したいです。

発生している問題

質問できる方がおらず、こちらで質問するに至りました。
・methodの「not in [0]」が何を意味しているかわかりません(method全体をそもそもしっかり理解できておりません)。
・collect_listがいきなり出てくるのですが、何者でしょうか。他行にて宣言の記述がありませんでした。
・「col」などから察するに、データフレームを扱っている処理のようですが、aaa列をmethodで処理した結果をbbbにリネームと言うことでしょうか。

該当のソースコード

Python

1 2def method(value_list): 3 vals = list(filter(lambda x : x not in [0], value_list)) 4 vals_int = list(map(int, vals)) 5 if len(vals_int) >= 1: 6 ret = Counter(vals_int).most_common()[0][0] 7 return int(ret) 8 else: 9 return 0000 10 11list = [] 12list.append(method(collect_list(col('aaa'))).alias('bbb'))

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2021/01/27 01:06

> [0]がなにを意味しているのかわかりません。 断片のコードでは答えられる人はいないのでは?
Fur0

2021/01/27 01:24

申し訳ありませんでした。追記いたしました。 見せられる範囲が限られているため、もしかしたら修正後でも理解が難しい場合があるかもしれません...。 本当に申し訳ございません。
guest

回答2

0

python

1list.append(method(collect_list(col('aaa'))).alias('bbb'))

ここですが、collect_listは関数です。どこかで定義されているはず。名前指定でimportしているのかもしれません。

colも関数です。このみかけ上からはpandas.Dataframeと関係あるようには見えません。

aliasですが、methodの返り値に付いていますが、それはintです。int に alias というメショッドはないので、エラーになると思います。

また、method は 0000 を返すことがありますが、これなんでしょう? 数値として 0 を 表したいのか、8進数を表したいのか、意味不明ですね。

投稿2021/01/27 02:24

TakaiY

総合スコア13765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Fur0

2021/01/27 02:32

回答ありがとうございます。 collect_listはpysparkの部品のようです。他は私も調査中です...!
guest

0

ベストアンサー

[0]は、0という整数を要素とするリストです。

こういうものが分からないときは、pythonの対話モードで以下のように確認してください。

shell

1> python 2Python 3.8.3 (default, Jul 2 2020, 17:30:36) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32 3Type "help", "copyright", "credits" or "license" for more information. 4>>>

というようにpythonを起動します。

[0]を調べて見ましょう。

python

1>>> print(type([0])) 2<class 'list'> 3>>> print(list.__doc__) 4Built-in mutable sequence. 5 6If no argument is given, the constructor creates a new empty list. 7The argument must be an iterable if specified.

[0]の型はリストで、リストは可変な列であることがわかります。
value_listとして、適当なリストを設定して動かしてみましょう。

python

1>>> value_list = ['abc', '0', '1', 0, 1, 2, 3,] 2>>> print(value_list) 3['abc', '0', '1', 0, 1, 2, 3] 4>>> val = list(filter(lambda x : x not in [0], value_list)) 5>>> print(val) 6['abc', '0', '1', 1, 2, 3]

これを見れば、この行が何をやっているのかがわかるかもしれません。

あと注意事項ですが、昔の人が書いたpythonプログラムはpython2系の場合が多いのですが、最近多くの人が使っているのはpython3系です。python2系とpython3系では互換がないので、どういうpythonを使っているかを明記して質問することをお勧めします。

pythonのバージョンを調べるには、以下のようにしてください。

shell

1> python -V 2Python 3.8.3

私は、いつも対話モードで関数を定義しています。

python

1>>> def method(value_list): 2... vals = list(filter(lambda x : x not in [0], value_list)) 3... vals_int = list(map(int, vals)) 4... if len(vals_int) >= 1: 5... ret = Counter(vals_int).most_common()[0][0] 6... return int(ret) 7... else: 8... return 0000 9... 10>>> print(type(method)) 11<class 'function'>

ただし、途中に空白行が入っているとそこで入力が切れて、そのあとがエラーになるので、空白行を入れないようにしてください。

投稿2021/01/27 01:29

編集2021/01/27 02:42
ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Fur0

2021/01/27 02:02

ありがとうございます。 Pythonは3系です。 追加で質問なのですが、対話モードで複数行の関数を定義することができません(methodが定義できません)。 現在は業務でPythonのコードをJavaに書き換え可能かを検証しているところなので、Pythonのファイルだけあって実行環境がないため、対話モードだけが頼りです。 申し訳ございませんが、よろしくお願いします。
ppaul

2021/01/27 02:56

関数定義は可能です。回答の方をご覧ください。 また、pythonは以下のように非対話的に実行できます。 > python foo.py 質問者さんの会社の方針に口出しするつもりはありませんが、ある言語で開発したシステムを他言語に書き換えるのは多くの場合悲惨な結果になります。Delphiのような過去の言語でかかれたものは仕方がないのですが、多大のコストをかけて移植してみたがバグが多くてわからない、ということになりがちです。 性能問題があるならJavaよりはC/C++ですし、そうでないならPython人口が増える昨今、pythonでサポートの問題はないと思います。 もし、仕様書の残っていないようなプログラムならわざわざ解析する価値もないので、要件定義からやり直した方が長期的にはコストパフォーマンスが良いですよ。
Fur0

2021/01/28 12:08

本当はそうしたいです...。
ppaul

2021/01/28 12:39

技術の分からない上司ほど、困った選択をするのが世の常ですね。 まあ、pythonのスキルを上げるチャンスだと思って頑張ってください。 アドバイスですが、ソースコードを見る限り、前任者の方はプログラミングが下手です。業務として解析するのはいいですが、プログラミングスタイルを真似しない方がよろしいかと思います。
Fur0

2021/01/31 06:25

下手なのですね...! 端的に言うと、どんな処理をしているのか理解し難いことが理由でしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問