【问题标题】:Can you create dictionaries with just a single function?你能用一个函数创建字典吗?
【发布时间】:2017-06-08 16:16:37
【问题描述】:

作为一个初学者,我为这个功能感到非常自豪。虽然我相信可能有一种更简单、更 Pythonic 的方式来做同样的事情:

Genes = ['Gen1', 'Gen2', 'Gen3']
Mutations = ['Gen1.A', 'Gen1.B', 'Gen2.A', 'Gen3.A', 'Gen3.B', 'Gen3.C']

def RawDict(keys, values):
    dictKeys = []
    dictValues = []
    for key in keys:
        keyVal = []
        for value in values:
            if value.find(key) == -1:
                pass
            else:
                keyVal.append(value)
        dictKeys.append(key)
        dictValues.append(keyVal)       
    return zip(dictKeys, dictValues)

GenDict = dict(RawDict(Genes, Mutations))

print(GenDict)

上面的函数是在键(基因)中放置多个值(突变)的一种相当复杂(我认为)的方法。但是我想知道是否可以调整一下,这样我就可以通过这样做来获取字典:

dict(GenDict, Genes, Mutations)

print(GenDict)

我的斗争涉及当我在函数中使用 dict 时,这将不起作用:

Genes = ['Gen1', 'Gen2', 'Gen3']
Mutations = ['Gen1.A', 'Gen1.B', 'Gen2.A', 'Gen3.A', 'Gen3.B', 'Gen3.C']

def fullDict(dictName, keys, values):
    dictKeys = []
    dictValues = []
    for key in keys:
        keyVal = []
        for value in values:
            if value.find(key) == -1:
                pass
            else:
                keyVal.append(value)
        dictKeys.append(key)
        dictValues.append(keyVal)       
    dictName = dict(RawDict(Genes, Mutations))

fullDict(GenDict, Genes, Mutations)

print(GenDict)

由于没有定义 GenDict,因此上述方法不起作用。

【问题讨论】:

  • 你想要的输出是什么?
  • 一个字典,其中基因是键,突变是每个键的值。所以 Gen1 有 ['Gen1.A', 'Gen1.B'] 作为值等等。
  • 为什么你想让你的函数看起来像fullDict(GenDict, Genes, Mutations)而不是GenDict = fullDict(Genes, Mutations)?这似乎很奇怪。
  • @MiguelAlberolaCano 对于代码风格,您是否有想要改进的工作代码?我认为这不是主题,但您可能需要考虑codereview.stackexchange.com
  • 没有考虑,但是谢谢!

标签: python python-3.x dictionary key python-3.6


【解决方案1】:

据我了解,您想从这里移开:

gen_dict = make_dictionary(genes, mutations)

到这里:

make_dictionary(gen_dict, genes, mutations)

make_dictionary 函数“创建”变量gen_dict 的位置。

不幸的是,这并不是变量的真正工作方式。如果你想定义一个名为GenDict 的变量,方法是使用GenDict = ...。你可以这样做:

gen_dict = {}
fill_dictionary(gen_dict, genes, mutations)

这将创建一个名为gen_dict 的变量并将其分配给一个新的空字典。然后,您的函数将通过并将内容添加到该字典中:

def fill_dictionary(d, genes, mutations):
    for g in genes:
      d[g] = [m for m in mutations if m.startswith(g)]

但是调用函数不会导致新变量出现在调用者的作用域中。 (这并不完全正确,因为 globals(),但对于大多数意图和目的来说,确实如此。)

(顺便说一句,有一个可以创建字典的单行代码:dictionary = { g : [m for m in mutations if m.startswith(g+".")] for g in genes }。在 Google 或 StackOverflow 上搜索列表推导和字典推导——它们太棒了!)

【讨论】:

  • 这是一个很好的解释!我正在检查:)
  • 太棒了!既然我已经阅读了有关列表理解如何工作的信息,那么我正在窃取您的单行字。另外我想我会滥用字典和列表等,而不是循环大量变量和字典等。谢谢! :)
  • 很高兴它有帮助!是的,列表推导很棒。
【解决方案2】:

我假设您希望“Gen”按其包含的数值存储。

Genes = ['Gen1', 'Gen2', 'Gen3']
Mutations = ['Gen1.A', 'Gen1.B', 'Gen2.A', 'Gen3.A', 'Gen3.B', 'Gen3.C']
the_dict = {i:[] for i in Genes}

for i in Mutations:
    new_val = i.split(".")

   the_dict[new_val[0]].append(i)

print(the_dict)

输出:

{'Gen2': ['Gen2.A'], 'Gen3': ['Gen3.A', 'Gen3.B', 'Gen3.C'], 'Gen1': ['Gen1.A', 'Gen1.B']}

【讨论】:

  • 那个。曾是。漂亮。
  • 请问您是否知道此类事情的任何来源?通过在 python 文档中查找随机函数来组成函数似乎效率不高。从存储库中获取高于我技能水平的函数似乎不是一个好主意......
  • 您可能希望首先查看 Stackoverflow 上标有 dict-comprehension 和列表理解的其他问题,并尝试解决其他用户自己发布的问题。为了更好地了解列表和字典理解,您可以查看此链接:stackoverflow.com/questions/14507591/…
  • 谢谢!我去查一下!
  • 很高兴能帮上忙!
【解决方案3】:

我假设您有使用 Python 以外的其他语言进行编程的背景;一种允许您更改函数参数的语言。好吧,Python 没有。问题不在于使用dict,而在于您分配给函数参数这一事实。这不会在函数之外产生影响。你想做的大概是这样的:

def fullDict(keys, values):
    return { key: [ value for value in values if key in value] for key in keys }

print(fullDict(Genes, Mutations))

【讨论】:

  • 谢谢,很有帮助!
猜你喜欢
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多