如何用最小的迭代在嵌套列表中找到单个值(及其位置)?



假设我有以下嵌套列表:

my_list = [
['a', 'b', 'c', 'd'],
['a', 'c', 'd'],
['b', 'c', 'd', 'e'],
['a', 'c'],
]

我想找到在整个列表中只出现一次的任何值,以及它们在父列表中的位置。例如,'e'只出现一次,它在my_list[2]中。

我能想到的唯一方法是至少进行三次迭代。例如:

for letter in ['a', 'b', 'c', 'd', 'e']:  # Iteration 1
count = 0
for child_list in my_list:            # Iteration 2
if letter in child_list:
count += 1
if count == 1:
print(letter)
for i in range(len(my_list)):     # Iteration 3
if letter in my_list[i]:
print(i)

或:

counter = {}
for i in range(len(my_list)):         # Iteration 1
for letter in my_list[i]:         # Iteration 2
if letter not in counter:
# Store the count and (first) position of each letter
counter[letter] = [1, i]
else:
counter[letter][0] += 1
for letter in counter:                # Iteration 3
if counter[letter][0] == 1:
print(letter)
print(counter[letter][1])

有没有一种方法可以做到这一点,而不需要这么多迭代?

下面是使用python集和字典完成问题的方法:

my_list = [
['a', 'b', 'c', 'd'],
['a', 'c', 'd'],
['b', 'c', 'd', 'e'],
['a', 'c'],
]
visited = set()
singletons = {}
for i, L in enumerate(my_list):
for v in L:
if v not in visited:
visited.add(v)
singletons[v] = i
else:
singletons.pop(v, None)
print(singletons)

输出:

{'e': 2}

这里有一个简单的方法,通过单次迭代(即每个元素只访问一次)创建一个{letter: [count, first position]}的字典:

d = {}
for i, lst in enumerate(my_list):
for item in lst:
if item in d:
d[item][0] +=1
else:
d[item] = [1, i]

输出:

{'a': [3, 0], 'b': [2, 0], 'c': [4, 0], 'd': [3, 0], 'e': [1, 2]}

有趣的问题,不确定这是否是你之后,但这里是:

x = 0
y = 0
output = {}
duplicates = []
while x < len(my_list):
if y < len(my_list[x]):
value = my_list[x][y]
y = y + 1
if value in output:
del output[value]
duplicates.append(value)
elif not value in output and not value in duplicates:
output[value] = x
else:
y = 0
x = x + 1

你得到的是:

{'e': 2}

这是一个单循环,但所涉及的工作可能相当于运行两个嵌套循环。

最新更新