预先计算以元组为值的字典值

时间:2016-06-17 19:44:12

标签: python python-3.x dictionary tuples

我有以下代码示例,其中我为每个func AllEquals2(v ...interface{}) bool { if len(v) < 2 { return true } return reflect.DeepEqual(v[:len(v)-1], v[1:]) } 创建一个字典result,其值为2个数字的元组。

id

我的想法是,我最终会在一个字典下汇总所有这些字典键值对(也许这部分需要重新设计..)。

我正在处理的问题是针对特定# populate the ids list (contents of the current directory which is for a speicif id name) ids_list = [filename for filename in glob('*' + .txt) def some_numerical_calc(filename): # calculates and returns some number as string def size_of_file(filename): # calculates and returns size number as string def count_stuff(id, filename): result = { id: (some_numerical_calc(filename), size_of_file(filename)) } for id in ids_list: for f in files_list: count_stuff(id, f) 的{​​{1}}大于1的情况;在这些情况下,我希望每个files_list的元组内的每两个数字都添加相同id的前一个数字。

  

作为示例

     

filename

     

它有filename的位置   ids_list = ['001', '002', '003']

     

如果

     

id='001'提供files_list=['file1.txt', 'file2.txt', 'file3.txt']和   some_numerical_calc('file1.txt')代表10

     

size_of_file('file1.txt')提供80和   some_numerical_calc('file2.txt')代表150

     

size_of_file('file2.txt')提供35和   some_numerical_calc('file3.txt')代表30

     

然后,我希望size_of_file('file3.txt')的输出为120

我知道tuples是不可变的。我正在努力想出一个实现来为每个id预先计算所有文件的2个数字,然后创建它的特定字典条目。或者,也许我应该删除元组结构 - 即使我希望使用namedtuples并将2个数字存储在set(?)中。任何建议都将不胜感激。

希望获得有效和pythonic的建议。

4 个答案:

答案 0 :(得分:2)

部分问题在于您严重组织了代码。你太早创建词典了。

考虑一下你是否重新组织了这样的事情:

selectedSong[1]

现在您的词典是在汇总数据后创建的。

答案 1 :(得分:1)

要创建包含总和的元组,您可以执行以下操作*:

result[id] = (sum(some_numerical_calc(filename) for filename in files_list),
              sum(size_of_file(filename) for filename in files_list))

但就像使用当前代码一样,这将在dict中为所有id键存储相同的元组值。您目前无法将特定files_list与特定id相关联。

*如果您只想通过files_list而不是两次进行一次迭代,则可以从此处调整其中一个答案:Python element-wise tuple operations like sum

答案 2 :(得分:1)

您可以尝试混合地图和总和:

resultDict = {}

for id in ids_list:
    resultDict[id] = (sum(map(some_numerical_calc(files_list[id]))), sum(map(size_of_file(files_list[id]))))

编辑:

根据您的具体情况提供更详细的示例。有些部分将在尖括号的注释中描述。

#<Get list of ids as strings>
files_list = {} #Initialize the files dictionary.

for id in ids_list:
    #<Switch to directory based on id>
    files_list[id] = [filename for filename in glob('*' + .txt)]

def some_numerical_calc(filename):
    # calculates and returns some number as string
def size_of_file(filename):
    # calculates and returns size number as string

result_dict = {} #Init results.

for id in ids_list:
    resultDict[id] = (sum(map(some_numerical_calc(files_list[id]))), sum(map(size_of_file(files_list[id]))))

答案 3 :(得分:1)

您的代码有一些奇怪的地方,例如,每次调用count_stuff时都会创建一个新字典,但是从不对它进行任何操作或返回它。从问题看来,您似乎希望将所有内容添加到一个字典中。

这样的事情可能会更好:

def some_numerical_calc(filename):
    # calculates and returns some number as string
def size_of_file(filename):
    # calculates and returns size number as string

def count_stuff(id, file_list):
    some_number = 0
    size = 0
    for filename in file_list:
        some_number += some_numerical_calc(filename)
        size += size_of_file(filename)
    return (some_number, size) 

results = {}
for id in ids_list:
    results[id] = count_stuff(id, file_list))
print results