这里的新手,正在寻找一种用Python处理一些数据的简洁方法。
我有一个0和1的列表,长度在2到10位数的CSV文件中。我想计算该CSV中每个排列的出现次数。
这样做有简洁的方法吗?
这就是我所拥有的:
LL = float(0)
LW = float(0)
WL = float(0)
WW = float(0)
with open('filename.csv', 'rb') as csvfile:
my_content = csv.reader(csvfile)
for row in my_content:
if not row:
continue
else:
if len(row) == 2:
if row == ['0', '0']:
LL += 1
if row == ['0', '1']:
LW += 1
if row == ['1', '1']:
WW += 1
if row == ['1', '0']:
WL += 1
等。对于每个长度的行......
这适用于2位,但我希望有另一种方法来执行更长的列表。谢谢你的帮助!
答案 0 :(得分:3)
您可以使用collections.Counter
。由于它是在字典上实现的,您需要将(可变list
)行放入(不可变的)tuple
中以使用它们:
from collections import Counter
count = Counter(map(tuple, my_content))
示例:
>>> data = [['0', '0'], ['0', '1', '0'], ['0', '0']]
>>> count = Counter(map(tuple, data))
>>> count
Counter({('0', '0'): 2, ('0', '1', '0'): 1})
这使您无需为要计算的每件事物定义单独的变量,也无法手动创建和增加字典,并且可以访问.most_common(n)
等便利的额外功能。
答案 1 :(得分:2)
这应该会给你一个字典,将排列映射到他们的计数
import collections
import csv
answer = collections.defaultdict(int)
with open('filename.csv') as infile:
for row in csv.reader(infile):
answer[''.join(row)] += 1
如果您要在示例中运行此代码,您将拥有一个类似于以下内容的字典:
answer = {'00' : 1,
'01' : 1,
'10' : 1,
'11' : 1,
}
答案 2 :(得分:0)
首先,您可以只使用“LL = 0.0”而不是浮点数(0)。小数点表示它是浮点数。无论如何,你不需要浮点数,所以你可以使用整数。
接下来,您不需要my_content变量。只需“for csv.reader(csvfile)中的行”。
此外,使用单个字典而不是四个变量会更好。您可以使用类似“binCounts = {'00':0,'01':0,'10':0,'11':0}”而不是代码来自“if len(row)== 2: “等等,只需要这样的代码:
如果binCounts中有'.join(行): binCounts [''。join(row)] + = 1
但是,您提到csv文件中的数字可以是2到10位数。这只会计算完全两位数的行。你能举例说明你的csv文件是什么样的吗?
答案 3 :(得分:0)
实际上,您正在尝试计算csv文件中显示的所有二进制数。最好的方法似乎是创建一个字典,其中包含实际数字和值的键。
假设你已经创建了一个函数parserow()[左边作为学生的练习(:-)],取1和0的行并返回该值的等价物。或者,如果(例如)'0001'被认为与'01'或'000001'不同,则可以返回实际连接的字符串
我假设你想要计算整个内容文件
countdict = {}
for row in my_content:
outval = parserow(row)
if outval not in countdict.keys():
countdict[outval] = 0
countdict[outval] += 1
然后,这应该会给你一个字典,其中包含已找到的所有可能性。您甚至可以在dicitionary中输入错误条目以显示有多少行具有非法值。