如何从现有文件创建两个列表并将它们相互比较?

时间:2013-04-13 02:06:35

标签: python list python-3.x dictionary

所以我有一个分为四个不同类别的文件: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分开并将它们与年份进行比较。任何有关这方面的帮助都会非常有帮助!

3 个答案:

答案 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)

这种方法的优点是,在读入数据后允许进行许多不同的数据处理,而不必担心列号是否正确等等。