如何检查列表中的字符串内的2个值是否不相同 输出:

如何解决如何检查列表中的字符串内的2个值是否不相同 输出:

超级简单的问题。假设我在Python中有以下列表:

variables = ['A1,A1','A2,B2','A1,C2','B3,B3','C4,C4']

现在,我只需要保留逗号前后值不同的那些项。在这种情况下,输出为:

result = ['A2,C2']

我已经有了一个'不太优雅'解决方案:

new_list = []
for i in range(len(variables)):
    j = variables[i].split(",")
    if j[0] != j[1].replace(" ",""):
        z = "{},{}".format(j[0],j[1])
        new_list.append(z)

注意:我必须添加replace才能删除空格,但这并不重要...

还有另一种(更好的方法吗?也许 regex

注释二:我也尝试使用列表理解:

lista_differents = ["{},j[1]) for i in range(len(variables)) if j[0] != j[1].replace(" ","")] 

但是我仍然必须弄清楚如何添加j = variables[i].split(",")

有什么想法吗?

解决方法

您可以尝试使用列表理解和set进行尝试。您基本上将字符串分成2个列表,然后查看这2个元素的集合是否具有len> 1,这意味着两者都是唯一的。

variables = ['A1,A1','A2,B2','A1,C2','B3,B3','C4,C4']

[i for i in variables if len(set(i.split(',')))>1]
['A2,C2']

如果您对运行时感到不便,请尝试使用这种方法而无需使用split(',')。这比基准测试中最快的速度要快得多。

[i for i in variables if len(set(i))>3]

编辑:添加基准测试结果(长度为300000的输入数组,macbook pro 13)

  • Akshay Sehgal(第一)-每个循环215毫秒±9.77毫秒(平均±标准偏差,共运行7次,每个循环1次)
  • Akshay Sehgal(第二个)-每个循环136 ms±195 µs(平均±标准偏差,运行7次,每个循环10个)
  • Aviv Yaniv -每个循环468毫秒±39.4毫秒(平均±标准偏差,共运行7次,每个循环1次)
  • jakub -每个循环252毫秒±29.8毫秒(平均±标准偏差,共运行7次,每个循环1次)
  • 医学博士。灰烬阿拉姆(Ashraful Alam)-每个循环252毫秒±29毫秒(平均±标准偏差,共运行7次,每个循环1次)
,

这是查看唯一字符数量的另一种方法。允许的最大值为3(即字母,数字,逗号)。

l = ['A1,C4'

[i for i in l if len(set(i)) > 3]

输出:

['A2,C2']

...以及对@ AkshaySehgal基准测试的友好挑战。 :-)

,
variables = ['A1,C4']

result = [a for a in variables if a.split(',')[0]!=a.split(',')[1].replace(" ","")]

print(result)
,
[v for v in variables if str.__ne__(*v.replace(" ","").split(","))]

您可以使用str.__ne__(x1,x2)功能,该功能等效于x1 != x2*将列表解压缩为单独的参数,因此.split(",")的输出被制成两个位置参数(假设字符串中仅包含一个,字符)。

,

不使用额外内存的解决方案:

variables = ['A1,C4']

def find_same_with_seperator(variables,SEPERATOR = ','):
    same_vars = []
    for v in variables:
        # Finding seperator index
        seperator_index = 0
        for i in range(len(v)):
            if SEPERATOR == v[i]:
                break
            seperator_index += 1
        # If no seperator
        if 0 == seperator_index:
            continue
        # Comparing parts
        before_seperator = 0
        after_seperator  = seperator_index + 1
        the_same = True
        while after_seperator < len(v):
            if v[before_seperator] != v[after_seperator]:
                the_same = False
                break
            before_seperator += 1
            after_seperator  += 1
        if the_same:
            same_vars.append(v)
    return same_vars

# ['A1,C4']
print(find_same_with_seperator(variables))
,

通过将项目放入集合并计算元素数量来检测项目是否不同,这是Python中历史悠久的传统。

[a for a in variables 
   if len(set(a.split(','))) > 1]

Python中的另一个习惯用法是通过仅使用一个元素遍历列表来在列表理解内进行“赋值”。因此,另一个可能的解决方案是:

[a for a in variables 
   for pair in [a.split(',')] 
   if pair[0] != pair[1]]

Python 3.8的walrus operator可让您编写:

[a for a in variables 
   if (pair := a.split(','))[0] != pair[1]]

但是我认为这很丑陋而且很难阅读。

,

这只是一个经典问题。一种建议的解决方案是检查字符串的非平凡旋转。我相信这个问题已经在几次面试中使用过。

[x for x in variables if (x+','+x).find(x,1,-1) == -1]

Out[183]: ['A2,C2']

P / s :这个问题比熊猫或任何特定的编程语言更多地是关于逻辑/算法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?