我有以下代码示例,其中我为每个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的建议。
答案 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