如何解决如何检查列表中的字符串内的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 举报,一经查实,本站将立刻删除。