【问题标题】:apply string of boolean on list在列表上应用布尔字符串
【发布时间】:2017-08-11 08:44:52
【问题描述】:

我有两个列表。

第一:

["a<4", "b<3", "c<6"]

第二:

["T", "F", "F"]

我想应用布尔列表将第一个列表变为:

["a<4", "b>3", "c>6"]

将较小的变为较大的取决于布尔列表。

我该怎么做?

【问题讨论】:

  • 除了使用字典字典吗?
  • 如果两个列表的大小相同,则只需对其进行迭代。 (伪代码)for i in list1: if not boolList[i]: change_element_list1 如果我的评论对您有帮助,那么我会将它们作为答案。让我知道
  • 从大变小或者这不是必需的怎么办?

标签: python list boolean


【解决方案1】:

我来自 R,所以我不喜欢循环和 if 语句。如果您需要做的只是根据条件从小变大,您可以使用numpy 轻松地对其进行矢量化。这些行中的一些东西

l1 = ["a<4", "b<3", "c<6"]
l2 = ["T", "F", "F"]

import numpy as np
n1 = np.array(l1)
n2 = np.array(l2) == "F"
n1[n2] = np.char.replace(n1[n2], "<", ">") 
print n1
## ['a<4' 'b>3' 'c>6']

【讨论】:

  • 啊哈,太过分了
  • @aahung 为什么要矫枉过正?一个简单的向量化而不是编写循环和 if 语句?当我在 Python 中工作时,我只使用 numpy 数组,因为这使我的代码缩短了 10 倍。
  • 无意冒犯,这确实是一个很好(而且优雅)的解决方案。我的意思是 NumPy 不是预装包,安装第三个包来解决它是矫枉过正。
【解决方案2】:

你可以试试:

>>> list1 = ["a<4", "b<3", "c<6"]
>>> list2 = ["T", "F", "F"]
>>> for index in range(len(list1)):
    if list2[index] == "F":
        temp_data = (list1[index]).replace("<",">")
        list1[index] = temp_data

>>> print list1
['a<4', 'b>3', 'c>6']

【讨论】:

    【解决方案3】:

    你可能想要这个

    def transform(statement, corretness):
        if corretness == 'F':
            if '<' in statement:
                return statement.replace('<', '>')
            else:
                return statement.replace('>', '<')
        return statement
    
    statements = ["a<4", "b<3", "c<6"]
    correctness = ["T", "F", "F"]
    
    statements = [transform(s, c) for (s, c) in zip(statements, correctness)]
    // ['a<4', 'b>3', 'c>6']
    

    【讨论】:

      【解决方案4】:

      我没有测试过代码。我直接把这个写给这个编辑器。 希望对您有所帮助。

      a = ["a<4", "b<3", "c<6"]
      b = ["T", "F", "F"]
      newa = list()
      for i in range(len(a)):
          if b[i] == 'F':
              if '<' in a[i]:
                  newa.append(a[i].replace("<",">"))
              elif '>' in a[i]:
                  newa.append(a[i].replace(">","<"))
          else:
              newa.append(a[i])
      
      print newa
      

      【讨论】:

        【解决方案5】:
        list1 = ["a<4", "b<3", "c<6"]
        list2 = ["T", "F", "F"]
        def replace(k):
            return k.replace("<",">") if "<" in k else k.replace(">","<")
        list2= [replace(i) if j=="F" else i for i,j in zip(list1,list2)]
        print(list2)
        

        这会根据第二个列表反转条件。

        【讨论】:

          【解决方案6】:

          只是为了好玩:

          [''.join([a, '<>'[(o == "<") ^ (c == "T")], n]) for (a, o, n), c in zip(x, y)]
          

          例子:

          >>> x = ["a<1", "b<2", "c>3", "d>4"]
          >>> y = ["T", "F", "F", "T"]
          >>> [''.join([a, '<>'[(o == "<") ^ (c == "T")], n]) for (a, o, n), c in zip(x, y)]
          ['a<1', 'b>2', 'c<3', 'd>4']
          

          【讨论】:

            猜你喜欢
            • 2023-03-04
            • 1970-01-01
            • 2021-10-25
            • 2014-03-30
            • 2013-06-13
            • 2018-11-05
            • 2021-09-07
            • 2014-08-06
            • 2011-08-21
            相关资源
            最近更新 更多