【问题标题】:Implement a group_by_owners dictionary [closed]实施 group_by_owners 字典 [关闭]
【发布时间】:2017-05-24 22:53:21
【问题描述】:

我对 TestDome.com Fileowners 问题进行了成功尝试,并想看看是否有人有建议来简化我的答案。在线 IDE 使用 Python 3.5.1。如果您想自己解决问题并且只是在寻找答案,这里有一个。众所周知,我是一名 Python 专家,所以这花了我很长一段时间来制作大量的修补程序。即使关于语法或一般清洁度,任何 cmets 都会有所帮助。谢谢!

实现一个 group_by_owners 函数:

接受包含每个文件名的文件所有者名称的字典。 以任意顺序返回包含每个所有者名称的文件名列表的字典。 例如,对于字典 {'Input.txt': 'Randy', 'Code.py': 'Stan', 'Output.txt': 'Randy'},group_by_owners 函数应返回 {'Randy': ['Input. txt', 'Output.txt'], 'Stan': ['Code.py']}。

class FileOwners:

@staticmethod
def group_by_owners(files):
    val = (list(files.values()))                    #get values from dict
    val = set(val)                                  #make values a set to remove duplicates
    val = list(val)                                 #make set a list so we can work with it
    keyst = (list(files.keys()))                    #get keys from dict
    result = {}                                     #creat empty dict for output
    for i in range(len(val)):                       #loop over values(owners)
        for j in range(len(keyst)):                 #loop over keys(files)
            if val[i]==list(files.values())[j]:     #boolean to pick out files for current owner loop
                dummylist = [keyst[j]]              #make string pulled from dict a list so we can add it to the output in the correct format
                if val[i] in result:                #if the owner is already in the output add the new file to the existing dictionary entry
                    result[val[i]].append(keyst[j]) #add the new file
                else:                               #if the owner is NOT already in the output make a new entry 
                    result[val[i]] = dummylist      #make a new entry
    return result

files = {
'Input.txt': 'Randy',
'Code.py': 'Stan',
'Output.txt': 'Randy'
}

print(FileOwners.group_by_owners(files))

输出:

{'Stan': ['Code.py'], 'Randy': ['Output.txt', 'Input.txt']} 

【问题讨论】:

    标签: python python-3.x loops dictionary if-statement


    【解决方案1】:

    Holly molly,这么简单的东西有很多代码:

    def group_by_owners(files):
        result = {}
        for file, owner in files.items():  # use files.iteritems() on Python 2.x
            result[owner] = result.get(owner, []) + [file]  # you can use setdefault(), too
        return result
    
    files = {
        'Input.txt': 'Randy',
        'Code.py': 'Stan',
        'Output.txt': 'Randy'
    }
    
    print(group_by_owners(files))
    # {'Stan': ['Code.py'], 'Randy': ['Output.txt', 'Input.txt']}
    

    您可以通过将collections.defaultdict 用于result 并将其所有键初始化为list 来进一步简化它 - 如果它以前不存在,您甚至不需要执行创建新列表的杂技附加到它。

    【讨论】:

      【解决方案2】:

      我个人发现投票的答案很难理解,而其他一些则有点笨重。这是我的版本:

      def group_by_owners(files):
      
      ownerdict = {}
      
      for key, value in files.items():
          if value in ownerdict:
              ownerdict[value].append(key)
          else:
              ownerdict[value] = [key]
      return ownerdict
      
      
      files = {
          'Input.txt': 'Randy',
          'Code.py': 'Stan',
          'Output.txt': 'Randy'
      }
      print(group_by_owners(files))
      

      【讨论】:

        【解决方案3】:

        这对我有用。我相信这会更高效、更简单。

        # Input dictionary.
        files = {
                'Input.txt': 'Randy',
                'Code.py': 'Stan',
                'Output.txt': 'Randy'
            }   
        # Function to group the files.   
        def group_by_owners(files):
        
            # Dictionary object to hold the result.
            result = {}
        
            for key, value in files.items():
        
                if value not in result.keys():
        
                    # Insert the values into the resulting dictionary
                    # by interchanging the key, values.
                    result[value] = [key]
                else:
        
                    # Append the othet file name if the owner is same.
                    result[value].append(key)
        
            return result
        
        print(group_by_owners(files))
        

        这是输出:

        {'Randy': ['Input.txt', 'Output.txt'], 'Stan': ['Code.py']}
        

        【讨论】:

          【解决方案4】:

          我刚开始学习,我也是 python 的菜鸟,但使用的是 2.7。所以请省去打印的括号。

          我喜欢你关于虚拟列表和附加的想法。类似的东西,但可能更干净一点:

          files = {
              'Input.txt': 'Randy',
              'Code.py': 'Stan',
              'Output.txt': 'Randy'
          }
          owners=[]
          filenames=files.keys()
          for key in files:
              if files[key] not in owners:
                  owners.append(files[key])
          print owners
          print filenames
          
          result={}
          for i in owners:
              resultvalues=[]
              for key in files:
                  if files[key]==i: 
                      resultvalues.append(key)
                      print resultvalues
                      result[i]=resultvalues
          print result
          

          【讨论】:

            【解决方案5】:

            我在这里提到易于理解的解决方案,

            owner = []
            for i in dict1.keys():
            if j not in owner:
                owner.append(j)
            results = {}
            for i in owner:
                result = []
                for j in dict1.keys():
                    if dict1.get(j) == i:
                        result.append(j)
                    results[i] = result
            print results
            

            【讨论】:

              【解决方案6】:
              def group_by_owners(files):    
                  values = []
                  dic = {}
              
                  for k,v in files.items():
                      values.append(v)
              
                  s_values = set(values)
                  l_values = list(s_values)
              
                  for i in l_values:
                      keys=[] 
                      for k,v in files.items():
                          if v == i:
                           keys.append(k)
                      dic[i]=keys            
              
                  return dic
              

              【讨论】:

              • 对代码的解释将有助于更好地回答
              【解决方案7】:

              你们看起来好多了,我花了 3.5 个小时通过大量的尝试和错误得到答案,因为我是 python 新手,而且思维不集中,感谢 @zwer 教授新东西。

              dic={'apple':['green','red'], 'power': ['voltage'],'banana': ['green','red'],'current':['voltage'],'grass':['green'],'tiger':['lion']}
              
              
              i = 0
              adic = {}
              while i < len(dic):
                  key = list(dic)[i]
                  for key2 in list(dic):
                      if key2 != key:
                          j = 0
                          while j < len(dic[key]):
                              if dic[key][j] in dic[key2]:
                                  color = dic[key][j]
                                  if dic[key][j] in adic:
                                      if key not in adic[color]:
                                          adic[dic[key][j]].append(key)
              
                                  else:
                                      mdic = {dic[key][j]: [key]}
                                      adic.update(mdic)
                              else:
                                  if dic[key][j] not in adic:
                                      mdic = {dic[key][j]: [key]}
                                      adic.update(mdic)
                              j = j + 1
                  i = i + 1
              print(adic)
              

              【讨论】:

                【解决方案8】:
                class FileOwners:
                    def group_by_owners(files):
                    temp=[]
                
                    for i in files:
                        if files[i] not in temp:
                            temp.append (files[i])
                        result={}
                
                    for j in temp:
                        temp1=[]
                        for i in files:
                            if files[i]==j: 
                                temp1.append(i)
                                result[j]=temp1
                    return (result)
                
                files = {'Input.txt': 'Randy',
                        'Code.py': 'Stan',
                        'Output.txt': 'Randy'}
                
                print(FileOwners.group_by_owners(files))
                

                【讨论】:

                • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
                【解决方案9】:

                您必须将 Dictionary 迭代到 Dictionary 并比较值并将键附加到新列表中。在新字典中获取输出。

                class FileOwners:
                
                    @staticmethod
                
                    def group_by_owners(files):
                        new_dic = {}
                
                        for key,val in files.items():
                            key_list = []
                            for k,v in files.items():
                
                                if v == val:
                                    #print(v)
                                    key_list.append(k)
                                    new_dic[v]= key_list
                
                        return new_dic
                        #print(new_dic)
                files = {
                    'Input.txt': 'Randy',
                    'Code.py': 'Stan',
                    'Output.txt': 'Randy'
                }
                print(FileOwners.group_by_owners(files))
                

                【讨论】:

                  【解决方案10】:

                  我制作了所有者及其相关文件名列表的字典。为此,我首先创建了字典,其中传递的字典 files 的值作为键,空列表作为值。然后循环遍历files 并在空列表中附加files 的键

                  def group_by_owners(files):
                      return_dict = {}
                      owner_files = files.keys()
                      for f in owner_files:
                          return_dict[files[f]] = []
                      for f, n in files.items():
                          return_dict[n].append(f)
                      return return_dict
                  

                  【讨论】:

                  • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
                  【解决方案11】:

                  我昨天开始学习 Python,在 testdome 上遇到了这个问题。这是我的答案:

                  def group_by_owners(files):
                      f = files.values()
                      s = set(f)
                      newdict={}
                      fileOwners = list(s)
                      for owner in fileOwners:
                          l=[]
                          for file in files:
                              if owner == files[file]:
                                  l.append(file)
                          newdict[owner]=l
                      return newdict
                  
                  
                  files = {
                      'Input.txt': 'Randy',
                      'Code.py': 'Stan',
                      'Output.txt': 'Randy'
                  }   
                  print(group_by_owners(files))
                  

                  【讨论】:

                    【解决方案12】:
                    1. 这是一些需要理解的复杂代码。
                    2. 但是是解决方案之一。

                          files={
                            'input.txt':'randy',
                            'output.txt':'randy',
                            'code.py':'stan'
                            }
                        k=files.keys()
                        newfiles={value:key for key,value in files.items()}
                        emptylist=[]
                        for key in k:
                            if key not in newfiles.values():
                                missfile=key
                                valuetoadd=files[missfile]
                        emptylist.append(newfiles[valuetoadd])
                        emptylist.append(missfile)
                        newfiles[valuetoadd]=emptylist
                        print(newfiles)
                      

                    【讨论】:

                      【解决方案13】:

                      这是我对 defaultdict 的回答:

                          from collections import defaultdict
                          
                          d = defaultdict(list)
                      
                          def group_by_owners(files):
                              for k,v in files.items():
                                  d[v].append(k)
                              return dict(d.items())
                      
                          if __name__ == "__main__":    
                              files = {
                                  'Input.txt': 'Randy',
                                  'Code.py': 'Stan',
                                  'Output.txt': 'Randy'
                              }   
                              print(group_by_owners(files))
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-03-17
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-05-28
                        • 2021-04-16
                        • 2012-07-01
                        • 2010-09-12
                        相关资源
                        最近更新 更多