Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stumped-在Python中,从一个目录列表中获取具有多个关联值的唯一键_Python_Dictionary - Fatal编程技术网

Stumped-在Python中,从一个目录列表中获取具有多个关联值的唯一键

Stumped-在Python中,从一个目录列表中获取具有多个关联值的唯一键,python,dictionary,Python,Dictionary,我正在解析一个csv文件以执行一些基本的数据处理。我正在使用的文件是一个网站的用户活动日志,格式如下: 用户ID、Url、页面加载数、交互数 用户ID和Url是字符串,页面加载数和交互数是整数 我试图确定哪个url具有最佳的交互页面比率 我正在努力解决的部分是获取唯一的值并聚合来自列的结果 我编写了以下代码: import csv from collections import defaultdict fields = ["USER","URL","LOADS","ACT"] file =

我正在解析一个csv文件以执行一些基本的数据处理。我正在使用的文件是一个网站的用户活动日志,格式如下:

用户ID、Url、页面加载数、交互数 用户ID和Url是字符串,页面加载数和交互数是整数

我试图确定哪个url具有最佳的交互页面比率

我正在努力解决的部分是获取唯一的值并聚合来自列的结果

我编写了以下代码:

import csv
from collections import defaultdict

fields = ["USER","URL","LOADS","ACT"]

file = csv.DictReader(open('file.csv', 'rU'), delimiter=",",fieldnames=fields)
file.next()

dict = defaultdict(int)

for i in dict:
    dict[i['URL']] += int(i['LOADS'])
这个很好用。它返回一个唯一url列表,其中包含字典中按url列出的总加载次数-{“url a”:1000,“url B”:500}

问题是,当我尝试向url键添加多个值时,我被难住了

我已尝试修改for循环以执行以下操作:

for i in dict:
    dict[i['URL']] += int(i['LOADS']), int(i['ACT'])
我收到TypeError:+=:“int”和“tuple”的操作数类型不受支持。为什么第二个值被视为元组

我试着只添加inti[ACT],效果很好。只是当我同时尝试这两个值时

我使用的是python 2.6.7;关于如何做到这一点以及为什么它被认为是一个元组,有什么想法吗?

因为inti['LOADS'],inti['ACT']是一个元组:

>>> 1, 2
(1, 2)
如果要同时添加两个变量,只需将它们添加在一起:

+= int(i['LOADS']) + int(i['ACT'])
此外,您正在跟踪内置的dict和list类型。使用不同的变量名。一旦您的影子出现,您将无法使用内置列表:

>>> d = {1: 2, 3: 4}
>>> list(d)
[1, 3]
>>> list = 5
>>> list(d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
由于inti['LOADS'],inti['ACT']是一个元组:

>>> 1, 2
(1, 2)
如果要同时添加两个变量,只需将它们添加在一起:

+= int(i['LOADS']) + int(i['ACT'])
此外,您正在跟踪内置的dict和list类型。使用不同的变量名。一旦您的影子出现,您将无法使用内置列表:

>>> d = {1: 2, 3: 4}
>>> list(d)
[1, 3]
>>> list = 5
>>> list(d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
只是当我同时尝试这两个值时

您想如何添加它们?作为他们的总数

for i in list:
    dict[i['URL']] += int(i['LOADS']) + int(i['ACT'])
另外,不要使用list和dict作为变量名

import csv
fields = ["USER","URL","LOADS","ACT"]

d = {}
with open('file.csv', 'rU') as f:
    csvr = csv.DictReader(f, delimiter=",",fieldnames=fields)
    csvr.next()
    for rec in csvr:
        d[rec['URL']] = d.get(rec['URL'], 0) + int(rec['LOADS']) + int(rec['ACT'])
只是当我同时尝试这两个值时

您想如何添加它们?作为他们的总数

for i in list:
    dict[i['URL']] += int(i['LOADS']) + int(i['ACT'])
另外,不要使用list和dict作为变量名

import csv
fields = ["USER","URL","LOADS","ACT"]

d = {}
with open('file.csv', 'rU') as f:
    csvr = csv.DictReader(f, delimiter=",",fieldnames=fields)
    csvr.next()
    for rec in csvr:
        d[rec['URL']] = d.get(rec['URL'], 0) + int(rec['LOADS']) + int(rec['ACT'])

最好使用列表作为defaultdict容器:

import csv
from collections import defaultdict

d = defaultdict(list)
fields = ["USER","URL","LOADS","ACT"]

with open('file.csv', 'rU') as the_file:
    rows = csv.DictReader(the_file, delimiter=",",fieldnames=fields)
    rows.next()

    for row in rows:
        data = (int(row['LOADS']),int(row['ACT']))
        d[row['URL']].append(data)
现在你有了

d['someurl'] = [(5,17),(7,14)]
现在,您可以做任何您想做的事情,例如,URL的所有加载:

load_sums = {k:sum(i[0] for i in d[k]) for k in d}

最好使用列表作为defaultdict容器:

import csv
from collections import defaultdict

d = defaultdict(list)
fields = ["USER","URL","LOADS","ACT"]

with open('file.csv', 'rU') as the_file:
    rows = csv.DictReader(the_file, delimiter=",",fieldnames=fields)
    rows.next()

    for row in rows:
        data = (int(row['LOADS']),int(row['ACT']))
        d[row['URL']].append(data)
现在你有了

d['someurl'] = [(5,17),(7,14)]
现在,您可以做任何您想做的事情,例如,URL的所有加载:

load_sums = {k:sum(i[0] for i in d[k]) for k in d}

您可以使用面向对象的方法并定义一个类来保存信息。这比大多数其他答案都要冗长,但值得考虑

import csv
from collections import defaultdict

class Info(object):
    def __init__(self, loads=0, acts=0):
        self.loads = loads
        self.acts = acts
    def __add__(self, args): # add a tuple of values
        self.loads += args[0]
        self.acts += args[1]
        return self
    def __repr__(self):
        return '{}(loads={}, acts={})'.format(self.__class__.__classname__,
                                              self.loads, self.acts)

summary = defaultdict(Info)
fields = ["USER", "URL", "LOADS", "ACTS"]

with open('urldata.csv', 'rU') as csv_file:
    reader = csv.DictReader(csv_file, delimiter=",", fieldnames=fields)
    reader.next() # skip header
    for rec in reader:
        summary[rec['URL']] += (int(rec['LOADS']), int(rec['ACTS']))

for url,info in summary.items():
    print '{{{!r}: ({}, {})}}'.format(url, info.loads, info.acts)

您可以使用面向对象的方法并定义一个类来保存信息。这比大多数其他答案都要冗长,但值得考虑

import csv
from collections import defaultdict

class Info(object):
    def __init__(self, loads=0, acts=0):
        self.loads = loads
        self.acts = acts
    def __add__(self, args): # add a tuple of values
        self.loads += args[0]
        self.acts += args[1]
        return self
    def __repr__(self):
        return '{}(loads={}, acts={})'.format(self.__class__.__classname__,
                                              self.loads, self.acts)

summary = defaultdict(Info)
fields = ["USER", "URL", "LOADS", "ACTS"]

with open('urldata.csv', 'rU') as csv_file:
    reader = csv.DictReader(csv_file, delimiter=",", fieldnames=fields)
    reader.next() # skip header
    for rec in reader:
        summary[rec['URL']] += (int(rec['LOADS']), int(rec['ACTS']))

for url,info in summary.items():
    print '{{{!r}: ({}, {})}}'.format(url, info.loads, info.acts)

您需要什么样的输出?”URL A':1000:200?我试图实现的输出是{'URL A':1000100,'URL B':500100}。第一个变量是loads,第二个变量是actions。由于url在文件中多次出现,我正在尝试聚合url,并为该url添加所有加载和操作的总和。您需要什么样的输出?”URL A':1000:200?我试图实现的输出是{'URL A':1000100,'URL B':500100}。第一个变量是loads,第二个变量是actions。由于url在文件中多次出现,我正在尝试聚合url,并为该url添加所有加载和操作的总和。感谢有关list和dict的提示。我发现我在复制上面的代码时也犯了一个错误-这是“for i in dict:”而不是list。我试图实现的输出是{'URL A':1000100,'URL B':500100}。第一个变量是loads,第二个变量是actions。由于url在文件中多次出现,我正在尝试聚合url,并为该url添加所有加载和操作的总和。感谢有关list和dict的提示。我发现我在复制上面的代码时也犯了一个错误-这是“for i in dict:”而不是list。我试图实现的输出是{'URL A':1000100,'URL B':500100}。第一个变量是loads,第二个变量是actions。由于url在文件中多次出现,我正在尝试聚合url,并为该url添加所有加载和操作的总和。谢谢你!使容器成为一个列表使其更易于操作!谢谢你,伙计!使容器成为一个列表使其更易于操作!