【问题标题】:Creating unique device names创建唯一的设备名称
【发布时间】:2020-11-05 19:00:54
【问题描述】:

目的是创建唯一的设备名称。如果已存在具有相似名称的设备,则每次出现时附加一个递增 1 的整数。

这是我的方法:

def deviceNamesSystem(devicenames):
    if not devicenames:
        return None
    unique_device_names = []
    devices = Counter(devicenames) #Group devices by names
    for device_name,occurence in devices.items():
        for item_integer in range(occurence):
            #Append integer if device name already in list of unique devices
            if item_integer == 0:
                unique_device_names.append(device_name)
            else:
                unique_device_names.append(f"{device_name}{item_integer}")

    return unique_device_names

输入:['lamp', 'lamp', 'tv', 'lamp']

预期输出:['lamp', 'lamp1', 'tv', 'lamp2']

我的输出:['lamp', 'lamp1', 'lamp2', 'tv']

【问题讨论】:

标签: python


【解决方案1】:

这行得通!

public static List<String> uniqNames(List<String> names) {

  HashMap<String, Integer> namesFrequency = new HashMap<>();

  List<String> result = new ArrayList<>();
  
  for (String name : names) {

    if (!namesFrequency.containsKey(name)) {
      namesFrequency.put(name, 1);
      result.add(name);
    }else { 

      int frequency = namesFrequency.get(name);
      result.add(name + String.valueOf(frequency));
      namesFrequency.put(name, namesFrequency.getOrDefault(name, 0) + 1);

    }
  }

  return result;
}

【讨论】:

    【解决方案2】:
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    </head>
    <body>
    <div id="result">Result : </div>
    </body>
    <script>
    var presentDevice = ['tv', 'mobile', 'ac', 'mobile', 'laptop', 'laptop', 'laptop', 'mobile', 'tv', 'mobile', 'laptop', 'headphone', 'headphone', 'tv', 'tv'];
    let uniqueDevice = [];
    let deviceCount = [];
    function getUniqueDevice() {
    presentDevice.forEach(i => {
    if (uniqueDevice.includes(i)) {
    if (deviceCount.length > 0) {
     let filteObj = deviceCount.filter(o => o.name === i);
    filteObj[0].len = filteObj[0].len + 1;
    uniqueDevice.push(`${i}${filteObj[0].len}`);
    }
    } else {
    obj = { name: i, len: 0 }
    deviceCount.push(obj);
    uniqueDevice.push(i);
    }
    })
    document.getElementById('result').innerHTML = uniqueDevice.join(' ,');
    }
    getUniqueDevice();
    </script>
    </html> 
    

    【讨论】:

      【解决方案3】:
      devices = ['switch', 'tv', 'switch', 'tv', 'switch', 'tv']
      
      
      def name_devices(device_list):
          unique_devices = []
          device_dict = {}
          for device in device_list:
              if device not in device_dict:
                  device_dict[device] = 1
                  unique_devices.append(device)
              else:
                  updated_name = device + str(device_dict[device])
                  unique_devices.append(updated_name)
                  device_dict[device] = device_dict[device] + 1
          return unique_devices
      
      
      result = name_devices(devices)
      print(result)
      
      

      输出:['switch', 'tv', 'switch1', 'tv1', 'switch2', 'tv2']

      说明:使用 hashmap 来存储您看到的值,您可以记录您看到它的次数。因此,当您遇到第二个开关或电视时,您可以获取您已经看过它的次数并将其连接到项目字符串并将其放入您的结果数组中。

      需要 O(N) 时间和空间复杂度,因为我们遍历 items 数组一次并将该信息存储到 hashmap 中,因此需要 N 时间。

      【讨论】:

        【解决方案4】:

        这是我的解决方案,它应该可以工作。

        def nameDevices(devicelist):
            uniquedevices = []
            for i,device in enumerate(devicelist):
                occurence = devicelist[:i].count(device)
                if(occurence > 0):
                    uniquedevices.append(device + str(occurence))
                else:
                    uniquedevices.append(device)
            return uniquedevices
        

        【讨论】:

          【解决方案5】:

          使用字典:

          def get_unique_device_names(names):
              d = {}
              unique_names = []
              for name in names:
                  d[name] = d.get(name, 0)+1
                  if d[name] > 1:
                      unique_names.append("{}{}".format(name, d[name]-1))
                  else:
                      unique_names.append(name)
              return unique_names
          
          if __name__ == "__main__":
              test_case = ['lamp','lamp','tv','lamp']
              expected_output = ['lamp','lamp1','tv','lamp2']
              output = get_unique_device_names(test_case)
              assert output == expected_output
              print(output)
          

          输出:

          ['lamp', 'lamp1', 'tv', 'lamp2']
          

          解释:

          我已经声明了一个空字典,然后逐渐增加给定列表中设备的出现次数。然后,如果一个设备出现了不止一次,我将出现次数 - 1 添加到唯一设备名称列表中。

          【讨论】:

            【解决方案6】:

            也许你有更好的方法来处理它:

            myList=['lamp','lamp','tv','lamp','tv','lamp']
            dico={}
            result=[]
            
            for item in myList:
                if item in dico.keys():
                    dico[item]+=1
                    result.append(f"{item}{dico[item]}")
                else:
                    dico[item]=0
                    result.append(f"{item}")
            

            结果:

            ['lamp', 'lamp1', 'tv', 'lamp2', 'tv1', 'lamp3']

            【讨论】:

              【解决方案7】:

              使用itertools.count

              例如:

              from itertools import count
              
              
              data = ['lamp','lamp','tv','lamp'] 
              c = {i: count(0) for i in set(data)}    #For every item set initial count to 0
                  
                  
              result = []
              for i in data:
                  n = next(c[i])
                  if n == 0:
                      result.append(i)
                  else:
                      result.append(f"{i}{n}")
              print(result)
              

              for i in data:
                  n = next(c[i])
                  result.append(i if n == 0 else f"{i}{n}")
              

              输出:

              ['lamp', 'lamp1', 'tv', 'lamp2']
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-06-21
                • 2014-07-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多