質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python

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

Q&A

解決済

2回答

881閲覧

関数の引数に格納された文字列のリストに、remove()などの処理をさせたいが上手くいかない場合

dd_

総合スコア111

Python

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

0グッド

0クリップ

投稿2021/12/30 09:22

編集2021/12/30 10:20

実現させたい事

python

1import os 2 3def func(files, exists_files): 4#files には複数の絶対パス 5#exists_files には複数のファイル名 6 7 exists_name = [] 8 for i in exists_files: 9 exists_name.append(os.path.splitext(os.path.basename(i))[0]) 10 11 for name in exists_files: 12 for file in files: 13 if name in file: #絶対パスに文字が含まれるかをチェック 14 files.remove(file) 15 else: 16 continue 17 18 return files

この処理で
それぞれの引数には
別の関数でリスト型で取得した文字列のリストがあり
(func()内でprint()で表示させて引数に文字列のリストがあることは確かです。)

その一つ目の引数にremove()の処理をやっても
remove()が機能しませんでした。
エラーは出ずに、そのまま引数に入ってるfilesの中身が
return として返ってきてしまいます。
試した事

別のpython ファイル上で

python

1li1 = ["hohahoha", "fuuu", "hogehoge", "hotahota", "gagaga"] 2li2 = ["hoge", "fu"] 3 4new_lis = [] 5 6for i in li2: 7 for x in li1: 8 if i in x: 9 li1.remove(x) 10 else: 11 continue 12print(li1)

この単体のコードだとうまくいきました。

となると引数に冒頭のコードの引数に格納されているリストに
何か別の処理をしなければいけないのか?と思い

引数 リスト
引数 リスト処理できない
などでググってみましたが、今現在の私が参考にできそうなサイトが見つけられず

自分なりに

python

1import os 2 3def func(files, exists_files): 4 files_2 = [] 5 files_2.append(files) 6 7 exists_name = [] 8 for i in exists_files: 9 exists_name.append(os.path.splitext(os.path.basename(i))[0]) 10 11 for name in exists_files: 12 for files_2_in in files_2: 13 for file in files_2_in: 14 if name in file: 15 files_2.remove(file) 16 else: 17 continue 18 print(files_2) 19 20 return files

などやってみましたが、思うようにいきませんでした。

どうしたら引数にあるリストの内容を変えたりと
処理をさせることが出来ますでしょうか??

有識者様のお力をお借りできればと思います。
是非宜しくお願い致します。

追記 2021/12/30 19:17

最初のコードでの
引数の中の説明

if name in file:
をする説明を追加させて頂きました。
説明不足で申し訳ありませんでした。

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

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

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

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

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

ozwk

2021/12/30 09:30

exists_nameが使われていないように見えます
dd_

2021/12/30 10:04

ご指摘ありがとうございます。 見落としてました。本当に本当にありがとうございます。
guest

回答2

0

exists_filesにある値がfilesにあったら削除したいのであれば、for file in filesをやる必要はなくて以下のようにすれば想定通りの挙動になると思います。

python

1def func(files, exists_files): 2 3 exists_name = [] 4 for i in exists_files: 5 exists_name.append(os.path.splitext(os.path.basename(i))[0]) 6 7 for name in exists_files: 8 if name in files: 9 files.remove(name) 10 11 return files 12

あと、余計なことですがexists_nameに値を挿入するのはいいですが、挿入するだけで他で使わないなら消したほうがいいですよ

投稿2021/12/30 10:01

Supernove

総合スコア1154

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

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

dd_

2021/12/30 10:13 編集

ご回答ありがとうございます。 すみません!私の説明不足でした。 filesには絶対パスが入っていて exists_filesにはファイル名が入っていて files の中にexists_filesの文字が入ったものを files  から削除したく こういった構文になってました! exists_name = []、についてのご指摘もありがとうございます。 append脳になってて 仰る通り改善しなければと思います。。 ご丁寧にご回答本当にありがとうございます。
guest

0

自己解決

exists_nameを使うことで解決できました。
初歩的なミスでした。。。
皆様ありがとうございますm(_ _)m

投稿2021/12/30 10:22

dd_

総合スコア111

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問