Find element in list n times Python

Question:

Given are

a = [1, 4, 2, 5]

b = [[[0, 1]], [[0, 2]], [[0, 3]], [[0, 4]], [[0, 5]], [[0, 6]], [[0, 2]], [[0, 3]], [[0, 4]], [[0, 5]], [[0, 4]],
     [[0, 5]], [[0, 6]], [[0, 4]], [[0, 2]], [[0, 2]], [[0, 4]], [[0, 4]], [[0, 5]], [[0, 5]], [[0, 5]], [[0, 1]],
     [[0, 5]], [[0, 1]], [[0, 1]]]

My goal is to iterate over the list a and to identify (print) those elements in b which have the element of a as element at index 1. The whole thing becomes difficult by the fact that this process may occur exactly three times for each element. After that, the next index in a is to be selected.
In concrete terms, the whole thing should look like this at the end:

[[0, 1]]
[[0, 1]]
[[0, 1]]
[[0, 4]]
[[0, 4]]
[[0, 4]]
[[0, 2]]
[[0, 2]]
[[0, 2]]
[[0, 5]]
[[0, 5]]
[[0, 5]]

All elements in b beyond that are to be ignored, even and especially if they occur more than three times.

I have already tried various techniques ( random, while loop, etc.), racked my brain and searched this forum, but I am stuck.

It doesn’t matter which elements are selected in b, the main thing is that there are three for each element in a.

Asked By: python_ftw

||

Answers:

You may follow these steps to achieve your desired output

a = [1, 4, 2, 5]
b = [[[0, 1]], [[0, 2]], [[0, 3]], [[0, 4]], [[0, 5]], [[0, 6]], [[0, 2]], [[0, 3]], [[0, 4]], [[0, 5]], [[0, 4]],
     [[0, 5]], [[0, 6]], [[0, 4]], [[0, 2]], [[0, 2]], [[0, 4]], [[0, 4]], [[0, 5]], [[0, 5]], [[0, 5]], [[0, 1]],
     [[0, 5]], [[0, 1]], [[0, 1]]]

result = []
count = {}
for i in a:
    for j in b:
        if j[0][1] == i:
            if i not in count:
                count[i] = 1
                result.append(j)
            elif count[i] < 3:
                count[i] += 1
                result.append(j)

for i in result:
    print(i)
Answered By: Murari Mahaseth

This will count and filter your b input on a values using a Counter to count the values and appending to the filtered list only is the value count is less than 3.

from collections import Counter

a = [1, 4, 2, 5]

b = [
    [[0, 1]],
    [[0, 2]],
    [[0, 3]],
    [[0, 4]],
    [[0, 5]],
    [[0, 6]],
    [[0, 2]],
    [[0, 3]],
    [[0, 4]],
    [[0, 5]],
    [[0, 4]],
    [[0, 5]],
    [[0, 6]],
    [[0, 4]],
    [[0, 2]],
    [[0, 2]],
    [[0, 4]],
    [[0, 4]],
    [[0, 5]],
    [[0, 5]],
    [[0, 5]],
    [[0, 1]],
    [[0, 5]],
    [[0, 1]],
    [[0, 1]],
]

c = Counter()

b_filtered = []

b.sort(key=lambda x: x[0][-1])

for x in b:
    v = x[0][-1]
    if v in a and c[v] < 3:
        b_filtered.append(x)
    c[v] += 1

b_filtered contains

[[[0, 1]],
 [[0, 1]],
 [[0, 1]],
 [[0, 2]],
 [[0, 2]],
 [[0, 2]],
 [[0, 4]],
 [[0, 4]],
 [[0, 4]],
 [[0, 5]],
 [[0, 5]],
 [[0, 5]]]
Answered By: ljmc

If you want to make it easier, you can simply follow the steps below:

a = [1, 4, 2, 5]

b = [[[0, 1]], [[0, 2]], [[0, 3]], [[0, 4]], [[0, 5]], [[0, 6]], [[0, 2]], [[0, 3]], [[0, 4]], [[0, 5]], [[0, 4]],
     [[0, 5]], [[0, 6]], [[0, 4]], [[0, 2]], [[0, 2]], [[0, 4]], [[0, 4]], [[0, 5]], [[0, 5]], [[0, 5]], [[0, 1]],
     [[0, 5]], [[0, 1]], [[0, 1]]]

for val_a in a:
    counter = 0
    for val_b in b:
       if val_a == val_b[0][1]:
           counter += 1
           if counter < 4:
                print(val_b)

I hope I could help! 😀

Answered By: JLMelandri8
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.