【问题标题】:Python insert missing elements in arrayPython在数组中插入缺失的元素
【发布时间】:2023-03-17 09:45:01
【问题描述】:

我有一个格式如下的数组:

[(u'iapsetting', 0), (u'iap-mms',0)]

数组必须只包含这种类型的元组:

(u'mmssetting', 0) or (u'iapsetting', 0) or (u'iap-mms', 0)

我的第一个数组显然缺少 (u'mmssetting',0),但它可能缺少/现有元组的许多不同组合。

我正在努力寻找一种方法来添加正确的缺失元组。数组必须始终只包含 3 个元组。

这是我目前所拥有的,但它没有按预期工作:

    for type in setup: #setup is the array containing 1,2 or 3 tuples

       iap_found = False
       mms_found = False
       iap_mms_found = False

       if type[0]=='iapsetting':
              iap_found = True

       elif type[0]=='mmssetting':
              mms_found = True
       elif type[0]== 'iap-mms':
              iap_mms_found = True
       #Add missing settings

       if(iap_found==False):
          print("MISSING IAP",setup)
          setup.append((u'iapsetting',0))

       elif(mms_found==False):
          print("MISSING MMS",setup)
          setup.append((u'mmssetting',0))
       elif(iap_mms_found==False):
          print("MISSING IAP-MMS",setup)
          setup.append((u'iap-mms',0))

任何帮助将不胜感激,因为可能有更好的方法来做到这一点。谢谢。

萨拉

【问题讨论】:

  • 究竟是什么没有按预期工作?
  • 你应该把你所有的elifs改成ifs,否则它只会检查1个缺失的元素,但是如果2或3个缺失怎么办?
  • 您真的应该考虑为此使用dict。它特别适合存储名称-值对。它使查找条目更加直接。

标签: python arrays tuples missing-data


【解决方案1】:

试试这个:

existing = set(x[0] for x in setup)
for expected in ('iapsetting', 'mmssetting', 'iap-mms'):
    if expected not in existing:
        setup.append((expected, 0))

【讨论】:

    【解决方案2】:

    你做错的主要有两件事:

    • 您在循环内初始化了标志。
    • 您在完成对整个数组的循环之前就开始添加缺少的设置。

      # Initialize flags before entering loop:
      iap_found = False
      mms_found = False
      iap_mms_found = False
      
      for type in setup: #setup is the array containing 1,2 or 3 tuples
         if type[0]=='iapsetting':
             iap_found = True
         elif type[0]=='mmssetting':
             mms_found = True
         elif type[0]== 'iap-mms':
             iap_mms_found = True
      
      #Add missing settings after looping through the whole array: 
      
      if(iap_found==False):
         print("MISSING IAP",setup)
         setup.append((u'iapsetting',0))
      
      if(mms_found==False):
         print("MISSING MMS",setup)
         setup.append((u'mmssetting',0))
      if(iap_mms_found==False):
         print("MISSING IAP-MMS",setup)
         setup.append((u'iap-mms',0))
      

    【讨论】:

    • 谢谢 SiggiSv !这很好用!你有我送的蛋糕! ;P(虚拟蛋糕)
    【解决方案3】:

    你应该使用 if ... elif .. elif 而不是使用

    if not iap_found:
              print("MISSING IAP",setup)
              setup.append((u'iapsetting',0))
    if not mms_found:
              print("MISSING MMS",setup)
              setup.append((u'mmssetting',0))
    if not iap_mms_found==False:
              print("MISSING IAP-MMS",setup) 
              setup.append((u'iap-mms',0))
    

    if ..elif 的问题是只会执行一个分支。

    对于与if 不同(在这种情况下也更好)的其他解决方案,请参阅其他答案

    【讨论】:

      【解决方案4】:

      我认为集合最清楚地代表了这种逻辑。使用集合推导来提取字符串。

       REQUIRED_VALUES = {"mmssetting", "iapsetting", "iap-mms"}
       input_tuple_list = [(u'mmssetting', 1), (u'iap-mms', 3)]
      
       # set comprehension paired with set difference -- results in {"iapsetting"}
       missing_values = REQUIRED_VALUES - {val for val, count in input_tuple_list}
      
       # results in [(u'mmssetting', 1), (u'iap-mms', 3), (u'iapsetting', 3)]
       input_tuple_list.extend((val, 0) for val in missing_values)
      

      【讨论】:

      • 假设元组的整数元素并不总是零可能是安全的。因此,元组集将不起作用。
      • 是的,整数并不总是 0 :) 但谢谢! :)
      • @user4554133 我认为集合是处理这个问题的最佳方式。请查看更新。
      • 看起来不错。我会放弃原始代码,只使用新的东西。 (也无需将其标记为“更新”。该网站的 wiki 功能会处理这一点。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2017-01-20
      • 2011-07-12
      • 1970-01-01
      相关资源
      最近更新 更多