给出诸如['table', 'drawer', 'chair', 'reward', 'radar']
的列表
您将如何创建一个函数/ for循环,以返回列表中具有相反含义的单词的列表?我正在尝试仅包含给定单词的第一个实例
因此结果将是:
['drawer', 'radar']
而不是
['drawer','reward', 'radar']
到目前为止,我的代码返回后一个结果:
def find_reversals(lst):
emptylst = []
match = []
for word in lst:
new = word[::-1]
emptylst.append(new)
for i in lst:
for j in emptylst:
if i == j:
match.append(i)
print('{}'.format(match))
您可以在两个索引i
和j
上遍历列表,其中j
从i
开始(只要您想回文数即可)
found = set()
a = ['table', 'drawer', 'chair', 'reward', 'radar']
ret = []
for i in range(len(a)):
for j in range(i, len(a)):
if a[j][::-1] == a[i]:
word = ''.join(sorted(a[i]))
if word not in found:
found.add(word)
ret.append(a[i])
# ret = ['drawer', 'radar']
您重复计算的原因是,您没有跟踪是否找到了某些东西。在这种情况下,我通过set
和该单词的排序顺序对其进行了跟踪。
您可以执行以下操作:
lst = ['table', 'drawer', 'chair', 'reward', 'radar']
s = set(lst)
result = []
for word in lst:
reverse = word[::-1]
if reverse in s:
result.append(word)
s.remove(word)
print(result)
输出
['drawer', 'radar']
因为它使用一个集合,所以复杂度为O(n)
,其中n
是列表中元素的数量。
似乎您可以使用当前单词的索引来搜索切片。这使列表理解变得非常简单:
l = ['table', 'drawer', 'chair', 'reward', 'radar']
[word for i, word in enumerate(l) if word[::-1] in l[i:]]
# ['drawer', 'radar']
尽管这是O(n ^ 2)算法。
用途:
l = ['table', 'drawer', 'chair', 'reward', 'radar']
list_check = list(map(lambda x: ''.join(list(x)[::-1]),l))
#['elbat', 'reward', 'riahc', 'drawer', 'radar']
result = []
for i, val in enumerate(l):
if val in list_check:
if list_check.index(val) > i:
result.append(val)
#['drawer']