• 締切済み

pythonの集合に対するpop()操作

pythonの文字列の集合nameについてpop()を実行しました。 name={"bojyo","arai","araki","yamada","tanaka"} item=name.pop() この場合、itemが最後の要素の"tanaka"となり、ということは最後の要素が取り除かれるということかと思ったらそうではありませんでした。解説書には”最後の要素が取り除かれるわけではない”と書いてあり、じゃあどういう風に取り除かれるかという記載がありません。 実際にpop()を繰り返して1つづつ抜いていくときにどの要素が選ばれるのかパターンがわかりませんでした。アルファベティカルというわけでもないようです。どのような取り決めで除かれていくのでしょうか。

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

みんなの回答

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.2

表記上"tanaka"が最後の要素に見えますが pythonの集合(set)は要素に順序付けのないただの集合です。 ですのでpop()で要素の取り除かれる順番に規則性を期待してはいけません。 あえていうならpythonの実装コードがルールです(なのでバージョンアップ等で実装が変われば変わります)。

skmsk1941093
質問者

お礼

回答ありがとうございました。どれが取り除かれるのか不明という仕様だというのもやや消極的ではありますが、解決と言えそうです。期待できないということで。面白いものだなと思いました。

回答No.1

pythonは、まだやったことがないのですが、説明を見てみたのですが。 https://note.nkmk.me/python-list-clear-pop-remove-del/ >最後の要素が取り除かれるということかと思ったらそうではありませんでした この否定文章の、矛盾はもしかして、 「位置指定をすればその位置を削除するから」 という意味ではないでしょうか。 name={"bojyo","arai","araki","yamada","tanaka"} item=name.pop(3) なら、3番目の、yamadaがitemに入り、tanakaが1段せりあがるため。 ってことではないでしょうか・・・ たしかに、最後の1つが消えたわけじゃないですしね。 質問の意図は満たしているかもしれません。 ただ、私のほう、pythonはやったことがないので、 あくまで、予想でしかない回答ですが。 何かしら参考になれば!筋違いでしたらすいません。

skmsk1941093
質問者

お礼

回答ありがとうございます。考えてみると、この集合というのは、pythonではリスト、タプル、そして集合という似たような概念の1つですが、特に集合に関してはナンバリングされていないというものなので何が最後で何が最初なのかわからない、乱数のようなもので決めているのではないかと思います。コンピュータですからすべて手続き依存だと思いますが、乱数で決めていると思うと、何も期待できないわけですね。じゃあ、何のためにあるのかと聞きたくなります。面白い言語だと思います。他の言語は似たりよったり(お互い翻訳可能)ですが、これくらい飛躍があると新しい展開でも望めそうです。juliaだともっと面白いかもですが。

関連するQ&A

  • Python:空集合の判定 == set():

    次のPythonコードはある練習問題の一部です fruitsという集合に対して、入力を1つづつしていくと、集合が空になります その空になったときの変数をprintしたら set() が出ました そこで if fruits == set(): というif文を判定用に入れたら、print("OK")に飛び OK が出ました 質問: 1)集合が空のとき if fruits == set(): で判定する書き方は、正しい(一般的)でしょうか? 2) if fruits == {}: ではジャッジされないのはなぜでしょうか ちなみにAIに1)が判定されてOKが出るのは、空集合は set()だから(そういう仕様だから)との回答が出ましたが、いまいち正しいのかわかりません #code fruits ={1,2,3,4,5,6} for i in range(6): fruit = int(input()) fruits.discard(fruit) # 要素が存在してもいなくても削除 #print(fruits) #最後に set() が主力 if fruits == set(): print('OK') #入力 1 2 3 4 5 6 【回答上のご注意】 回答は、解答(答え)を求めています わたしはプログラマーではありません なので昭和的な「自分で考えろ」的なものは求めていません わからなければ答えない自由があなたにはあります 不明点があれば説明いたします

  • Python リスト内の要素取り出しについて

    ProgateでPythonを1から学んでいる初心者です。 現在、じゃんけんゲーム作成のセクションに取り組んでいるのですが、その中でリストの要素取り出しについて疑問点があるため質問いたしました。 詳しくは画像を参照いただければ分かりやすいかと思うのですが、 ------------------------------ def print_hand(hand, name='ゲスト'): # 変数handsに、複数の文字列を要素に持つリストを代入してください hands = ("グー", "チョキ", "パー") # リストhandsを用いて、選択した手が出力されるように書き換えましょう print(name + 'は' + hands[hand] + 'を出しました') ------------------------------- という点に関して、なぜ hands[hand] でリスト「hands」内の要素が取り出せるのか分かりません。 この時点では、「hand」が「hands」内の要素に対応していることは、明示されていなくないですか? グーが0、チョキが1、パーが2に対応することは分かっているのですが。。。 ずぶの素人質問で申し訳ございませんが、ご教授お願いいたします。

  • 【Javascript】多次元配列の位置取得

    Javacript初心者です。 多次元配列の特定要素を含む配列の位置(何番目の配列要素か)を取得したいのですが、 わからず、お力を貸していただけないでしょうか。 下記testArrayにおいて、bloodの値に「ab」を持つ配列要素が何番目かを取得したいです。 この場合、「3」番目ということを取得したいです。 ---------- var testArray = [ {"name":"yamada","age":30,"weight":62,"blood":"a"}, {"name":"tanaka","age":28,"weight":58,"blood":"b"}, {"name":"kamimura","age":46,"weight":65,"blood":"o"}, {"name":"takahashi","age":21,"weight":70,"blood":"ab"} ]; ---------- 単純に、下記のようなindexOf要素では調べることができませんでした・・・ testArray.indexOf("ab") 多次元配列での要素の位置取得をお教えいただけませんでしょうか。

  • Python について質問です

    私はPythonの初心者です。 今Python でCSVのファイルを読んで数値だけ(数値以外に文字列や空白などがあります)を計算処理出来なくて困っています。教えて頂けませんか? 質問は、BB.csvというファイルの数値だけの合計と平均を計算したいです。 私のコードは以下です。 # coding: utf-8 import csv import re import string DATAFILE = 'BB.csv' class UnicodeDictReader(csv.DictReader): def __init__(self, f, fieldnames=None): csv.DictReader.__init__( self, f, fieldnames) def main(): total = 0 all_sum = 0 line_num = 0 with open(DATAFILE) as csvfile: reader = UnicodeDictReader(csvfile) for record in reader: # 値を数値で取得 A = int(record['38186']) B = int(record['38181']) C = int(record['38143']) item_total = A + B + C total = item_total all_sum += item_total line_num += 1 average = all_sum / reader.line_num print(" %d + %d + %d = %d " % ( A, B, C, total)) print(u"合計 %d " % all_sum) print(u"平均 %d " % average) if __name__ == '__main__': main() BB.csvは以下です、 38186,38181,38143 1,1,4 1,1,4 ,, ,, 2020,2020,2020 1412,1412,1412 625,625,625 75,75,75 75,75,75 75,75,75 75,75,75 4,4,4 4,4,4 4,4,4 7828,7828,7828 X,, 0,0,0 0,0,0 ○,, 0,0,0 0,0,0 0,0,0 ,,AAA 0,0,0 0,0,0 0,0,0 ,BBB, 0,0,0 0,0,0 0,0,0 ,, 0,0,0 ,, 0,0,0 0,0,0 ,, 0,0,0 0,0,0 750,750,750 400,400,400 400,400,400 ,, 0,0,0 0,0,0 0,0,0 ,, 0,0,0 0,0,0 0,0,0 0,0,0 0,0,0 0,0,0 0,0,0 6,6,6 6,6,6 18,18,18 18,18,18 18,18,18 18,18,18 18,18,18 16,16,16 16,16,16 6,6,6 6,6,6 18,18,18 18,18,18 18,18,18 18,18,18 18,18,18 11,11,11 11,11,11 11,11,11 3,3,3 3,3,3 3,3,3 3,3,3 4,4,4 4,4,4 3,3,3 3,3,3 16,16,16 16,16,16 16,16,16 14,8,11 8,14,11 8,14,11 8,14,11 8,14,11 8,14,11 8,14,11 8,14,11 8,14,11 15,15,15

  • 同一ファイルからの文字列検索

    お世話になります。 今、ファイル処理を勉強しています。 hoge.txtに文字列が格納されています。 (hoge.txt) --------------------- suzuki yamada kimura tanaka ito suzuki kimura --------------------- hoge.txtの上の行より、下に検索を行い、 一致した場合、printf("HIT\n");と出力します。 動きは、 suzukiを検索文字列し、yamada~kimuraまで検索を行い、 もしヒットした場合、出力表示します。 suzukiが検索終了すると、次のyamadaを検索文字列として、 kimura~kimuraを検索します。 この動作を最後の行まで行えば終了です。 下記のfgets()で1行分を取得してからの 次の行への移行がわかりません。 FILE *fp; char name[256]; if( (fp =fopen( "hoge.txt", "r )) == NULL ){ return 0; } while( fgets(name, sizeof(name), fp ) != NULL ){ //ここで次の行以下とstrstr()で比較を行う } お手数をお掛けしますが、よろしくお願い致します。

  • C言語 関数が文字列を含む構造体を返すとき

    生徒名、テストの点数 を要素とする構造体 struct test{char name[10];int score;}; を定義し、 点数の大きいほうを返す関数 struct test Top(struct test test1,struct test test2) { if(test1.score > test2.score) return test1; else return test2; } を定義しました。(この状態では同点のとき後者を返してしまいますが) main関数内で struct test test1; struct test test2; strcpy(test1.name,"yamada"); test1.score=70; strcpy(test2.name,"tanaka"); test2.score=90; と宣言・代入したあと、Top関数が返した点数と名前を表示したいのですが、 名前の表示がうまくいってくれません。 文字配列の操作が誤っているのでしょうか? 実行したのは次の操作です。 printf("Top score = %d\n",Top(test1,test2).score); printf("Top man = %c\n",Top(test1,test2).name[0]); printf("Top man = %s\n",Top(test1,test2).name); Top score = 90 Top man = t Top man = tanaka と表示されるのを期待していたのですが、 前二つの表示が終わるとダンプを起こしてしまいます

  • メルアドをチェックする正規表現?

    こんにちは,よろしくお願いします。JavaScriptでメルアドをチェックしようと次のような文字列を,patternという変数に代入して, var pattern = "^[a-z0-9\-_.]+@[a-z\-]+(\.[a-z\-]+)*com|net|org|edu|gov|mil|int|info|biz|name|pro|museum|aero|coop|[a-z][a-z]$"; 次のようにチェックしたのですが, if(mail.match(pattern)){・・・ "aa"など,2つ以上の小文字のアルファベット文字列にマッチしてしまいます。つまり,@が入っていなくてもマッチしてしまいます。実は,正規表現の解説書を見てこのような文字列としたのですが,JavaScriptでは不都合な点があるのでしょうか?ご存知の方がいらっしゃいましたら,ご教授ください。よろしくお願いします。

  • テーブルに格納されている最後の行数が知りたい

    使用環境:mysql 5.1 内容:テーブルに格納されている最後の行数が知りたいです。 テーブル名:seito no name 1 tanaka 2 suzuki : : 100 kato のように1つのレコードに番号を振って名前をつけているのですが、 「seito」テーブルに登録されている最後の番号を取得するSQL文 を教えていただけないでしょうか? ちなみに、最後が必ず「kato」というわけではないので「seito」テーブルの noカラムにおける最後の番号を取得したいと考えてます。 上記の場合「100」番が取得できれば希望の結果となります。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • $a = ( $b == $c ) ? $d、 この読み方について

    $data = ($a == $b && $c != $d) ? $e[ 'name' ] . '<img src="' . $f[ 'name2' ] . '" title="' . $e[ 'name' ] . '" align="bottom" border ="0">': ''; こんにちは。上のコードを読み解こうとしているのですが、少しわからないので投稿させていただきました。 いつも見慣れている演算子は if やwhile などの制御構造に使われているのですが、今回出くわしたのは今まで見たことがないパターンでよくわかりません。 多分( )内は計算しているのだと思いますが、 次の ? の用途がわかりません。 その後は変数を含む文字列を横並びにくっつけている、というのはわかります。 これについて解説しているページ、またはこの用法についてご存知のかたおられましたらご教授ください。

    • ベストアンサー
    • PHP
  • 間違っているところを教えて下さい

    次のプログラムの間違っているところを教えて下さい。 ************************************************************** package siryou; import java.io.*; import java.util.HashMap; class Meibo { private HashMap address; private HashMap age; public Meibo(String s) { address.put("yamada", "沖縄"); address.put("sato", "東京"); address.put("tanaka", "北海道"); address.put("ikeda", "アメリカ"); age.put("yamada", "21歳"); age.put("sato", "30歳"); age.put("tanaka", "55歳"); age.put("ikeda", "12歳"); } public String getAddress(String n) { String name = n; String jyuusyo = (String)address.get(name); return jyuusyo; } public String getAge(String n) { String name = n; String nennrei = (String)age.get(name); return nennrei; } } class MeiboMain { public static void main(String args[])throws IOException { System.out.println("名前を入力して下さい。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); Meibo mi = new Meibo(str); mi.getAddress(str); String jyuusyo = mi.getAddress(str); System.out.println(str + "さんの住所は" + jyuusyo + "です。"); mi.getAge(str); String nennrei = mi.getAge(str); System.out.println(str + "さんの年齢は" + nennrei + "です。"); } } *************************************************************** 恐らくコンストラクタ内の処理が間違っていると思うんですが・・・ 実行すると、「NullPointerException」が出てしまいます。 渡した引数の処理がちゃんと出来ていないのかな?と思った のですが、どういう風に記述してよいのか分からなくて。 また、メソッド内で 取得した値がnullだった場合、「未設定」という文字列を戻り値と する処理を記述したいのですが、どのように書いたら良いので しょうか?

    • ベストアンサー
    • Java

専門家に質問してみよう