2017-02-06 6 views
1

こんにちは、プロダクトIDと場所を示すExcelスプレッドシートがあります。PythonはExcelスプレッドシートを読み込み、変数と条件に従って複数のリストを作成します

enter image description here

私は重複なしシーケンスの各製品のID すべての場所を一覧表示します。例えば

53424フェニックス、松山、フェニックス、松山、フェニックス、松山、フェニックスを持っています。

56224には、BoiseのSamarindaがあります。ソウル。 など

Pythonでこれを達成する最も良い方法は何ですか?

私はスプレッドシート内のセルだけを読むことができますが、何が良いのかはわかりません。

ありがとうございます。

the_file = xlrd.open_workbook("C:\\excel file.xlsx") 
the_sheet = the_file.sheet_by_name("Sheet1") 

for row_index in range(0, the_sheet.nrows): 
    product_id = the_sheet.cell(row_index, 0).value 
    location = the_sheet.cell(row_index, 1).value 

答えて

2

次のように重複を奪うようにPythonのgroupby()機能を利用するために必要があります。

from collections import defaultdict 
from itertools import groupby 
import xlrd 

the_file = xlrd.open_workbook(r"excel file.xlsx") 
the_sheet = the_file.sheet_by_name("Sheet1") 
products = defaultdict(list) 

for row_index in range(1, the_sheet.nrows): 
    products[int(the_sheet.cell(row_index, 0).value)].append(the_sheet.cell(row_index, 1).value) 

for product, v in sorted(products.items()): 
    print "{} has {}.".format(product, ', '.join(k for k, g in groupby(v))) 

これはあなたの製品を構築するための辞書でdefaultlist()を使用しています。したがって、辞書の各キーには商品IDが保存され、内容は自動的に一致するエントリのリストになります。最後にgroupby()は、各生の値を読み出すために使用され、連続して同じ値がある場合のために1つのエントリしか与えません。最後に、これが生成するリストは、それらの間のカンマで結合されます。

+0

素晴らしい!ご協力ありがとうございました。各出力に連続複製(1つだけ残す)を取り除くためにはもう1つのステップが必要です。 「フェニックス、松山、フェニックス、松山、フェニックス、松山、フェニックス」のように。フェニックス、フェニックス、松山、フェニックス、フェニックス、松山、フェニックス、松山、フェニックスの代わりに、" –

+0

スクリプトの現在のバージョンがそれを行う必要があります。つまり、今はgroupby() –

+0

を使用しています。あなたはこのような天才です! –

1

あなたは、Excelからのデータを格納し、製品IDに応じて、それを横断するdictionaryを使用する必要があります。

ので、以下のコードあなたを助ける必要があります -

the_file = xlrd.open_workbook("C:\\excel file.xlsx") 
the_sheet = the_file.sheet_by_name("Sheet1") 

dataset = dict() 

for row_index in range(0, the_sheet.nrows): 
    product_id = the_sheet.cell(row_index, 0).value 
    location = the_sheet.cell(row_index, 1).value 
    if product_id in dataset: 
     dataset[product_id].append(location) 
    else: 
     dataset[product_id] = [location] 


for product_id in sorted(dataset.keys()): 
    print "{0} has {1}.".format(product_id, ", ".join(dataset[product_id])) 

上記は(順番に)product_idの通りの場所の順序を維持します。

+0

ありがとうございました!しかし、私は順番にすべての場所が必要です - 53424のように "フェニックス、松山、フェニックス、松山、フェニックス、松山、フェニックス。だけでなく、 "松山、柳井" ... –

+0

もう一度あなたの助けてくれてありがとう。各出力に連続複製(1つだけ残す)を取り除くためにはもう1つのステップが必要です。 –

+0

連続した複製(1つの直後)を削除する場合は、変数を使用して前の行の値を保存し、現在の行の値と比較することができます。現在の値がまったく同じ場合、現在の値をデータセットに追加することは無視されます。 forループ内のすべての操作の後、前の値の変数を現在の値で更新します。 –

関連する問題