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

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

新規登録して質問してみよう
ただいま回答率
85.50%
リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

3回答

699閲覧

重複している数字を排除し新しくリストを作る方法

Spursfun2002

総合スコア15

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

1グッド

1クリップ

投稿2020/05/09 23:13

# Read a list of integers from input. # Each number is separated by a space. # Do not modify line 5. print("Enter a list of numbers separated by spaces:") #ここに4 3 5 2 5 1 3 5をいれて list = [int(s) for s in input().split()] # the variable 'list' contains the list of numbers # this is to show you the list, you can delete this line. # your code goes here.

このコードがあるときにOutputが421になるにはどのようなコードを使えばいいのか教えてほしいです。
サイドコレオをアップデートして申し訳ないです。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

ちょっと非効率かもしれませんが、手短に書けて分かりやすいのは、例えば以下かなと思います。

python

1ls = [4, 3, 5, 2, 5, 1, 3, 5] 2 3ls2 = [x for x in ls if 1 == ls.count(x)] 4 5print(ls2) # => [4, 2, 1]

何かの作業途中で、使い捨ての一回だけ行うような用途のものならば、元のリストが非常に長いものでもない限り、上記のコードでも事足りるのではと思いますが、以下のような改善が考えられます。

  • たとえば、先頭から2番目の数を調べる時点で、ls.count(3) によって、3 の出現回数の2回が得られて、その時点で3は除外対象と分かるので、以降のどこで 3 が見つかっても countを実行せずに除外対象とするように改善する。

  • ls.count は、lsに含まれる件数を数えますが、個数が1件なのかどうかだけが分かればよく、2件以上の場合、何件かは知る必要がないので、count を使わないようにする。

以上、参考になれば幸いです。

追記

上記の改善項目を反映したコードの一例を挙げておきます。

Python

1ls = [4, 3, 5, 2, 5, 1, 3, 5] 2 3 4ls2 = [] 5dup = set() 6 7for i, x in enumerate(ls): 8 if x in dup: 9 continue 10 if x in ls[i+1:]: 11 dup.add(x) 12 else: 13 ls2.append(x) 14 15 16print(ls2) # => [4, 2, 1]

改善前と改善後を比較してみました。元のリストlsは長さ10000で、要素は0以上2500未満のランダムな整数としました。

私の環境だと、改善後の所要時間は、改善前のだいたい10分の1になっています。

投稿2020/05/09 23:41

編集2020/05/10 02:14
jun68ykt

総合スコア9058

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

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

Spursfun2002

2020/05/10 05:42

ありがとうございます! Outputはほぼこれなのですが、このリストから[]をとるにはどうしたらいいのでしょうか?? 数字だけの状態がOutputに出す場合です。
jun68ykt

2020/05/10 07:06

コメントありがとうございます。 > 数字だけの状態がOutputに出す のであれば、私の回答に載せたコードであれば print(ls2) としているところを、ls2 の前に * をつけて print(*ls2) とすればよいかと思います。 例) https://repl.it/@jun68ykt/Q260228-3
Spursfun2002

2020/05/10 11:50

なるほど! ありがとうございます!
jun68ykt

2020/05/10 11:53

どういたしまして???? 解決したようで、よかったです????
guest

0

Python

1lst1 = # あなたのリスト 2lst2 = # あなたのリスト 3for n in set(lst1): 4 lst2.remove(n) 5result = sorted(set(lst1) - set(lst2), key=lst1.index) 6print(result) 7```これでいけます

投稿2020/05/10 00:57

ForestSeo

総合スコア2720

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

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

0

p.py

python3

1from itertools import groupby 2 3line = "4 3 5 2 5 1 3 5" 4print(f'{line}') 5 6nums = [int(x) for x in line.split()] 7single_indexs = sorted([nums.index(k) for k, g in groupby(sorted(nums)) if len(list(g)) == 1]) 8nums_singles = [nums[idx] for idx in single_indexs] 9print(nums_singles)

実行例
イメージ説明

groupby をつかって、 1度しか出現しない数字の nums 中で場所を集めています。
後は nums 中での場所をソートして、 nums から対象の値だけを抜きだしたリストを構築します。

投稿2020/05/10 03:32

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問