0

したがって、レベル、Char1、Char2、Years の 4 つの異なるカテゴリに分けられたファイルがあります。

Level     Char1   Char2   Years

1         Leon    Chris   1990-1999
2         Mario   Luigi   1990-1999
3         Peach   Cloud   1990-1999
4         Leon    Chris   2000-2009
5         Ghost   Garen   2000-2009
6         Mario   Vincent 2000-2009
etc...   etc...   etc..   etc...

Char1 と Char2 を比較して、1990 年から 1999 年に発生するが 2000 年から 2009 年には発生しない名前を出力したいので、この場合は出力されます。

These names are going away:
Luigi Peach Cloud etc...

それらをリストまたは辞書ファイルに入れる必要があると思いますが、char1とchar2を分離して年と比較する方法がわかりません。これに関するヘルプは非常に役立ちます。

4

3 に答える 3

0

この種の「どの名前がこのグループにあり、このグループにないか」は「セット」の仕事です。Python は内部的に実装されているため、データを日付列でグループ化し、セットの「減算」を使用するだけです。これは、「このセットの要素が他のセットに含まれていない」ことと同じであり、結果を取得します。

コード化されたデータ グループが 2 つしかないと仮定すると、必要なのは次のとおりです。

from collections import defaultdict

data = defaultdict(set)

with open("myfilename") as file_:
   for line in file_:
      line = line.split()
      if len(line) == 4 and line[0].isdigit():
          data[line[3]].add(line[1])
          data[line[3]].add(line[2])
   print ("These characters are going away:")
   print (" ".join(data["1990-1999"] - data["2000-2009"]))

「defaultdict」は Python の便利な機能で、この場合、for ループで 2 行を節約するだけです。それがなければ、次のように追加する必要があります。

if line[3] not in data:
    data[line[3]] = set()

上記のコードに。

于 2013-04-13T02:42:35.893 に答える
0
>>> import csv
>>> with open('test.csv') as f:
        print f.read()


Level,Char1,Char2,Years
1,Leon,Chris,1990-1999
2,Mario,Luigi,1990-1999
3,Peach,Cloud,1990-1999
4,Leon,Chris,2000-2009
5,Ghost,Garen,2000-2009
6,Mario,Vincent,2000-2009
>>> with open('test.csv') as f:
        r = csv.reader(f)
        next(r, None) # skip header

        names = set()
        for level, char1, char2, years in r:
            if years == "1990-1999":
                names += {char1, char2}
            else: # 2000 - 2009
                names -= {char1, char2}
        print "These names are going away"
        print " ".join(names)


These names are going away
Peach Luigi Cloud
于 2013-04-13T02:48:13.143 に答える
0

このようなファイルの便利なパターンは、最初の行のヘッダー項目でインデックス付けされた辞書にデータを読み込むことです。そのアプローチを使用すると、ソリューション ( からカンマ区切りのデータ ファイルを読み取るstdin) は次のようになります。

import sys

data = {}
hdrLabel = sys.stdin.readline().rstrip().split(",")
for header in hdrLabel:
    data[header] = []

for line in sys.stdin:
    for (i,item) in enumerate(line.rstrip().split(",")):
        data[hdrLabel[i]].append(item)

def getCharSet(cols,yrRange):
    s = set()
    for c in cols:
        s = s | {data[c][i] for i in range(len(data[c])) 
            if data["Years"][i] == yrRange}
    return s

set19 = getCharSet(["Char1","Char2"],"1990-1999")
set20 = getCharSet(["Char1","Char2"],"2000-2009")
print (set19-set20)

このアプローチには、データが読み込まれた後、列番号を正しく取得することなどを心配することなく、さまざまなデータ操作が可能になるという利点があります。

于 2013-04-13T03:02:13.837 に答える