2016-08-10 7 views
0

タイトルには、リスト内の重複を検出するだけでなく、それらを移動する方法他のリストにPython - テキストファイルで生成されたリストの重複を防ぐソリューションを探しています

私はプログラミングで比較的新しいです。私のローカルJCでPythonの入門コースを終えたばかりです。学期中、.txtファイルの行を読み込んでリストに入れ、リストをシャッフルし、単一のリストを2つの新しいリストに分割して印刷するプログラムを作成する考えがありました。これは、例えば、ゲーム内の2人のプレイヤーに一意の名前のオブジェクトを迅速に配布するために使用されます。ここでのコードは、これまでのように見えるものです:私はこれまでの仕事をするすべてのものが、何かを得ているlist.txtに=リンゴ、リンゴ、バナナ、梨、オレンジ、キウイ

import random 
#create list from text file 
list = [line.strip() for line in open("list.txt", 'r')] 

#Copy list to preserve the original 
list2 = list[::] 
random.shuffle(list2) #shuffle the order 

#If # of items = odd, remove one 
if len(list2) % 2 == 1: 
    del list2[-1] 

#Divide items into two lists 
A = list2[:len(list2)//2] 
B = list2[len(list2)//2:] 

print("The items in group A are: ", A) 
print("The items in group B are: ", B) 

ことを考えると

私が実装したいのは、プログラムが「リンゴ」と「リンゴ」の両方がリストAにあるかどうかを検出していれば、リストBに移動します。私は3つの解決法を考え出しましたが、 。解決策1は、2つの「リンゴ」をそのまま持ち、そこから検出/分類することです。

def moveDuplicates(in_list): 
    unique = set(in_list) 
    for each in unique: 
     count = in_list.count(each) 
     if count > 1: 
      return True 
     else: 
      return False 

問題は、私はこのようなうまく重複を検出することができるということですが、それはだから、私は、新しいリストのいずれかの位置を知ることができませんので、私はそれらのいずれかを移動指定する方法がわかりません毎回シャッフル。

解決策2は、「apple」の名前をapple1とapple2などに変更することです。このソリューションでは、どちらかの項目を簡単に削除して追加することができますが、同じ番号の2つの項目が同じリストにあることを検出する方法はわかりません。

解決方法3は、各リストに1つずつ配置されたシャッフルがDRY原則に違反する前に必ず重複する可能性があることを確認するための条件を記述するため、最悪です。

ソリューション2または3を使用するのが最も理想的なソリューションだと思うが、アスタリスクの代わりに何かがあることを示すために、グーグルが検索でアスタリスクを使用する方法と似た何かを使用している。

+0

は、おそらく 'collections 'のようなものを使用できます。カウンタは、あなたが何をしようとしているのかはっきりしていません。 – reptilicus

答えて

2

2つ以上の単語のコピーがある場合は、最初の2つ後のすべてを無視することができます。私の提案する解決方法は、リストを繰り返し値に分割します。この値は、両方のグループと単一の値によって共有され、2つのグループの間でシャッフルされ、分割されます。

import collections 

list = ['a', 'a', 'a', 'b', 'b', 'c', 'd'] 

# Split the list into words that occur once and ones that are repeats 
single = [] 
repeats = [] 
for word, count in collections.Counter(list).items(): 
    if count > 1: 
     repeats.append(word) 
    else: 
     single.append(word) 

# Each group gets a copy of the repeats 
group_a = repeats[:] 
group_b = repeats[:] 

# Now shuffle/divide the single values 
random.shuffle(single) 
half = len(single) // 2 
group_a.extend(single[:half]) 
group_b.extend(single[half:2*half]) 

好きな場合は、個々のグループにシャッフルを追加できます。

+0

私はかなり完璧に見えます。 – pzp

+0

私は単純に 'single [half:]'ではなく 'single [half:2 * half] 'を提案してもよいでしょう。 –

+0

@ juanpa.arrivillaga最初は私はあなたに同意しましたが、それから、奇数のアイテムがあった場合の状況を鮮明に処理していることに気付きました。シャッフル後、それはまだランダムです。それはかなりうまくいく! –

0

シンプルなサイクルを使用するのはどうでしょうか?私はあなたのためにそれを簡単にしようとします。私はあなたの考えを理解している場合、正しく、それはこのように実装することができます:だから

# Some input into this example 
fruits = ["apple", "apple", "banana", "pear", "orange", "kiwi"] 

# The code you're probably looking for 
first_basket = [] 
second_basket = [] 

for fruit in fruits: 
    if fruit not in first_basket: 
     first_basket.append(fruit) 
    elif fruit not in second_basket: 
     second_basket.append(fruit) 

print first_basket 
print second_basket 

あなたの最初のバスケットはフルーツから果物が含まれていない場合、それはfirst_basketに追加されます。それ以外の場合は、2番目のバスケットに果物が含まれていない場合は、second_basketに追加されます。したがって、両方のバスケットが既にあなたのリストから果物を持っている場合、それはどのバスケットにも追加されません。

この例では、["apple"、 "banana"、 "pear"、 "orange"、 "kiwi"](これはあなたのfirst_basketです)、[apple "](これはあなたのsecond_basketです)

+0

OPは結果的にリスト内の冗談を避けながら、等しく無作為に2つのリストにアイテムを分配したいと考えています。あなたは最後の部分を持っていたが、質問の主な焦点を逃した。 – pzp

関連する問題