所以我有一个分为四个不同类别的文件:Level,Char1,Char2和Years它看起来像这样:(文件继续等等)
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分开并将它们与年份进行比较。任何有关这方面的帮助都会非常有帮助!
答案 0 :(得分:0)
这种“这个名字在这个群体中,而不是在这个群体上”是 “套装”的工作。然后Python在内部实现 - 所以,您只需按日期列对数据进行分组,然后使用 设置“减法” - 与...相同 “此集合中的元素未包含在其中 其他设置“得到你的结果。
假设您只有两个haed编码的数据组,这就是您所需要的:
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精确版,在这种情况下只需要保存2行 在for循环中 - 没有它,就必须添加:
if line[3] not in data:
data[line[3]] = set()
到上面的代码。
答案 1 :(得分: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
答案 2 :(得分: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)
这种方法的优点是,在读入数据后允许进行许多不同的数据处理,而不必担心列号是否正确等等。