使处理嵌套dictionary对象的set对象类型转换的循环更加简洁

2024-05-29 05:09:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我们正在努力实现以下代码,其中必须处理将字典的值转换为set对象的问题。在这里您可以看到两个字典,即来自self.optionoption和来自self.option_space_dictoption_space_dict。你知道吗

option_space_dict中,在许多其他键值对中,我们关注的键值对是:

"extra_scripts" : [
                   ["Altera/AlteraCommon.lua",
                    "Altera/StratixIV/EP4SGX70HF35C2.lua"],
                   ["Altera/AlteraCommon.lua",
                    "Xilinx/Virtex7/xc7v2000tfhg1761-2.lua"]
                  ]

我们对其进行分析,得到以下两个键值对,每个键值对位于不同的字典中,但分组在同一个列表中,一个形式为[dict#1, dict#2, dict#3 ... ]的列表:

# could be sitting in dict#1
"extra_scripts" : ["Altera/AlteraCommon.lua",
                   "Altera/StratixIV/EP4SGX70HF35C2.lua"] 

或者

# could be sitting in dict#2
"extra_scripts" :  ["Altera/AlteraCommon.lua",
                    "Xilinx/Virtex7/xc7v2000tfhg1761-2.lua"]

option是一个参数,我们通过使用for循环对列表中的每个项进行迭代来获得,因此在调用方法getOptionCompack的任何一次迭代中,option基本上就是该列表中的dict#1dict#2等等中的任何一个。你知道吗

在方法getOptionCompack中,我们试图用各种键值对来构造集合,我们面临的问题是,我们需要能够访问嵌套列表来执行set()转换,这段代码已经克服了这个问题。你知道吗

def getOptionCompack(self) :

  result = [] # Initialize and empty list which we will return to this function
  for k,v in self.option.iteritems():
    # The general approach:
    # Check if the value, v of the option dictionary is actually a list
    # If it is, then we must handle the value, v of the the corresponding key that is located in option_space_dictionary differently
    # by iteratively accessing each nested list item using the while loop and making each of
    # these nested lists into a set() object
    if isinstance(v, list):
      i = 0
      while i < len(self.option_space_dict[k]):
        if set(v) != set(self.option_space_dict[k][i]):
          result.append((k,v))  
        i = i+1
    else:
      if set([v]) != set(self.option_space_dict[k]):
        result.append((k,v))
  return result

这主要通过循环实现:

  i = 0
  while i < len(self.option_space_dict[k]):
    if set(v) != set(self.option_space_dict[k][i]):
      result.append((k,v))  
    i = i+1

然而,我们认为应该有更好的方式来表达这一点。所以我们的问题是

我们可以用for循环来代替这个while循环吗?你知道吗

是否可以使用列表来执行getOptionCompack?我们尝试了:

def getOptionCompack(self) :  
  return [ (k, v) for k, v in self.option.iteritems() if set([v]) != { tuple(x) if isinstance(x, list) else x for x in  self.option_space_dict[k] } ]

但是这是行不通的,我们知道这是因为我们对self.option_space_dict[k]项的研究不够深入,无法得到self.option_space_dict[k][i]中附加的i参数所允许的单个嵌套列表。但我们不知道如何在这个理解中更进一步。你知道吗

对于循环和条件句的范围,是否建议我们在这里使用列表理解?或者我们会更像Python来遵循标准表达?你知道吗

我知道我在这篇文章中已经非常详细了,但是我认为最好解释一下我们在这里试图用代码做得更好的背后的一些背景,并分享我们尝试过但未能成功实现的替代方法。你知道吗

任何反馈意见或建议在此将不胜感激。非常感谢你!你知道吗


Tags: theinself列表forifspaceresult
1条回答
网友
1楼 · 发布于 2024-05-29 05:09:04

一:

# Your while
i = 0
while i < len(self.option_space_dict[k]):
    if set(v) != set(self.option_space_dict[k][i]):
      result.append((k,v))  
    i = i+1

# For loop
for item in self.option_space_dict[k]:
    if set(v) != set(item):
        result.append((k,v))

# As list comprehension
[(k,v) for item in self.option_space_dict[k] if set(v) != set(item)]

我只有99%确定这将工作,因为我没有你的数据来测试。你知道吗

二:

我不建议为这种方法做一个完整的列表。你应该保持现状。这样你可以更容易地改变它。在我看来,一个列表的理解不应该超过80个字符。(我的是68)

相关问题 更多 >

    热门问题