There are 2 issues to look at.

The original code will generate the error:

```
>>> first_lst = [('-2.50', 0.49, 0.52), ('-2.00', 0.52, 0.50)]
>>> second_lst = [('-2.50', '1.91', '2.03'), ('-2.00', '1.83', '2.08')]
>>> [((fir[0], float(fir[1])*float(sec[1]), float(fir[2])*float(sec[2])) for fir in first_lst) for sec in second_lst if fir[0] == sec[0]]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
NameError: name 'fir' is not defined
>>>
```

and `<generator object <genexpr>`

message is mentioned.

1) Let's fix the the code with minimum amount of changes by creating list comprehension:

```
>>> first_lst = [('-2.50', 0.49, 0.52), ('-2.00', 0.52, 0.50)]
>>> second_lst = [('-2.50', '1.91', '2.03'), ('-2.00', '1.83', '2.08')]
>>> [(fir[0],fir[1]*float(sec[1]),fir[2]*float(sec[2])) for fir in first_lst for sec in second_lst if fir[0] == sec[0]] # list comprehension
[('-2.50', 0.9359, 1.0555999999999999), ('-2.00', 0.9516000000000001, 1.04)]
>>>
```

2) In the original code, the bracket after `first_lst`

`)`

is misplaced.
If we place that bracket after the `sec[0]`

instead of list comprehension we get generator expression. And that will cause the `<generator object <genexpr>`

message:

```
>>> [((fir[0],fir[1]*float(sec[1]),fir[2]*float(sec[2])) for fir in first_lst for sec in second_lst if fir[0] == sec[0])] # generator object
[<generator object <genexpr> at 0x00000184EEDE29E8>]
```

In terms of syntax, the only difference is that one uses parenthesis instead of square brackets.

Note: If needed, there are two ways to convert a generator object to the list:

2a) Use asterisk (*) operator to unpack object to the list

```
>>> [*((fir[0],fir[1]*float(sec[1]),fir[2]*float(sec[2])) for fir in first_lst for sec in second_lst if fir[0] == sec[0])]
[('-2.50', 0.9359, 1.0555999999999999), ('-2.00', 0.9516000000000001, 1.04)]
>>>
```

2b) Use explicitly `list()`

```
>>> list((fir[0],fir[1]*float(sec[1]),fir[2]*float(sec[2])) for fir in first_lst for sec in second_lst if fir[0] == sec[0])
[('-2.50', 0.9359, 1.0555999999999999), ('-2.00', 0.9516000000000001, 1.04)]
>>>
```

`string`

and`float`

. Is that intentional or just an error? Your LC would fail if you have these as your tuples. Since`float`

cannot be multiplied to a`string`

. See my answer to fix that error.