假设我有以下嵌套列表:
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}
这是一个单循环,但所涉及的工作可能相当于运行两个嵌套循环。