This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Python complex formula using the items of a dictionary (or a list of dictionaries)

I have a list with 20 dictionaries that are similar to these:

dic1 = {"aa":1, "ba":1, "ca":1, "dd":2, "ee":2, "fa":2, "ga":4, "hh":4, "ia":1}

dic2 = {"aa":1, "bc":1, "cd":2, "dd":2, "ea":2, "fg":2, "gk":4, "hh":4, "mb":5}

dic3 = {"ab":1, "bd":2, "cm":2, "dj":2, "ej":2, "fa":2, "gg":2, "ha":4}


I have to apply the same formula to each dictionary and I would like to output a list with the results of the formula per dictionary (thus, a list with 20 integers).

The formula will vary according to the "value" amount:

In summary, per dictionary I need to calculate final_formula:

If value == 1, then my partial formula is: formula1 = (number of unique keys that contain value 1) [1 - x + x ((x-10/x) ^1]

If the value is anything above 1 (else), then my intermediary formulas are formulan = (number of unique keys with value i) [(value i) - x + x ((x-10/x)^(value i)]

final_formula = formula 1 + formula2 + formula3 (n formulas, where n is the number of distinct values =! 1). X is a constant that I will define. The output should be an integer.


A practical example: For my dic1, I have 4 keys with value ==1, 3 keys with value ==2, 2 keys with value ==4 The formula for dic1 thus is:

final_formula_dic1 = 4 [1 - x + x ((x-10/x)^1] + 3 [2 - x + x ((x-10/x)^2] + 2 * [4 - x + x ((x-10/x)^4]

For my dic2, I have 2 keys with value ==1, 4 keys with value == 2, 2 keys with value == 4, 1 key with value == 5 The formula for dic2 thus is:

final_formula_dic2 = 2 [1 - x + x ((x-10/x)^1] + 4 [2 - x + x ((x-10/x)^2] + 2 * [4 - x + x ((x-10/x)^4]

For my dic3, I have 1 key1 with value ==1, 6 keys with value == 2, 1 key with value == 4 The formula for dic3 thus is:

final_formula_dic3 = 1 [1 - x + x ((x-10/x)^1] + 6 [2 - x + x ((x-10/x)^2] + 1 * [4 - x + x ((x-10/x)^4]

I am applying each formula manually to each dictionary, but I have too many dictionaries in my list and this is error prone.

I would really like to iterate over all dictionaries and apply the formula (since it is the same criteria to all dictionaries) and create a list with results, for example, list = ['final_formula_dic1', 'final_formula_dic2', 'final_formula_dic3'...] which would be integers, for instance: list = ['3000', '3200', '1300'...].

I hope this makes sense. Thank you very much in advance!

python dictionary

This has no connection to bioinformatics, and appears to be an ordinary programming problem. Given your level of explanation and understanding, I think you should be able to figure it out with some research.

1 answer

Hope bioinformatics will benefit.

X = 2     # Define X here
DICTS = [
    {"aa":1, "ba":1, "ca":1, "dd":2, "ee":2, "fa":2, "ga":4, "hh":4, "ia":1},
    {"aa":1, "bc":1, "cd":2, "dd":2, "ea":2, "fg":2, "gk":4, "hh":4, "mb":5},
    {"ab":1, "bd":2, "cm":2, "dj":2, "ej":2, "fa":2, "gg":2, "ha":4},
]

for d in DICTS:
    dt = {}
    for key, value in d.items():
        if value not in dt:
            dt[value] = set()
        dt[value].add(key)

    final_result = 0
    final_formula = []
    for value in sorted(dt):
        n = len(dt[value])
        formula = f'{n} * ({value} - X + X * (X - 10 / X^{value})'
        final_formula.append(formula)
        result = n * (value - X + X * (X - 10 / X) ** value)
        final_result += result

    print(" + ".join(final_formula))
    print(final_result)

Output:

4 * (1 - X + X * (X - 10 / X^1) + 3 * (2 - X + X * (X - 10 / X^2) + 2 * (4 - X + X * (X - 10 / X^4)
354.0
2 * (1 - X + X * (X - 10 / X^1) + 4 * (2 - X + X * (X - 10 / X^2) + 2 * (4 - X + X * (X - 10 / X^4) + 1 * (5 - X + X * (X - 10 / X^5)
-97.0
1 * (1 - X + X * (X - 10 / X^1) + 6 * (2 - X + X * (X - 10 / X^2) + 1 * (4 - X + X * (X - 10 / X^4)
256.0

I am always reminded that there are star programmers, and more importantly kind people, who will answer even questions that are not meant for this forum.

Thank you very much for your help

Log in to answer this question.