Summing specific values in nested list Python [duplicate] - python

This question already has answers here:
Sum nested lists based on condition in Python
(6 answers)
nested lists combine values according to first value
(1 answer)
Closed 3 years ago.
I have a nested list that looks like this:
nested = [['a', 1], ['v', 2], ['a', 5], ['v', 3]]
I want to sum values in nested list for each letter value in list, so that output looks like this:
[['a', 6], ['v', 5]]
I have tried to play with for loops, but I couldnt find the solution.

There is probably a one liner for this using reduce and list comp, but I couldn't see it quickly.
nested = [['a', 1], ['v', 2], ['a', 5], ['v', 3]]
from collections import defaultdict
d = defaultdict(int)
for i in nested:
d[i[0]] += i[1]
retval = []
for k, v in d.items():
retval.append([k, v])
print(retval) # [['a', 6], ['v', 5]]

Related

Concentrate two lists alternating python [duplicate]

This question already has answers here:
How to zip two differently sized lists, repeating the shorter list?
(15 answers)
Closed 26 days ago.
I want to combine two lists in an alternating way in Python.
list1 = ['A']
list2 = [1, 2, 3, 4]
What I've tried:
combination = [x for y in zip(list1, list2) for x in y]
# Output:
['A', 1]
# Expected output:
['A', 1, 'A', 2, 'A', 3, 'A', 4]
How can I combine these two lists and get the expected output? (Preferably list comprehension)
One way is to use itertools cycle function:
from itertools import cycle
list1 = ['A']
list2 = [1, 2, 3, 4]
combination = [x for y in zip(cycle(list1), list2) for x in y]
This also works with
list1 = ['A', 'B']
list1*len(list2) will repeat the first list elements as many times as the length of the second list.
combination = [x for y in zip(list1*len(list2), list2) for x in y]
['A', 1, 'A', 2, 'A', 3, 'A', 4]

Replacing elements from list of lists when it matches elements from other list

a = [1,2,3,4,5]
b = [[3,4],[4,5],[6,7]]
I have two lists above.
I want to compare elements of each list from list b with elements of list a, a new list is to be formed which will be a list of lists replacing the unmatched elements with 'X.
So the output should be a new list of lists of length same as list b as below.
c = [['X','X',3,4,'X'],['X','X','X',4,5],['X','X','X','X','X']]
Thanks.
I tried the answer in this link
However it only works if there are only two lists to compare, and I want to compare a list of lists with a list.
I would use a nested list comprehension:
a = [1, 2, 3, 4, 5]
b = [[3, 4], [4, 5], [6, 7]]
out = [[x if x in s else 'X' for x in a]
for s in map(set, b)]
Output:
[['X', 'X', 3, 4, 'X'],
['X', 'X', 'X', 4, 5],
['X', 'X', 'X', 'X', 'X']]

Extending lists of lists [duplicate]

This question already has answers here:
Why do these list operations (methods: clear / extend / reverse / append / sort / remove) return None, rather than the resulting list?
(6 answers)
How do I iterate through two lists in parallel?
(8 answers)
How do I concatenate two lists in Python?
(31 answers)
Closed 6 months ago.
I'm trying to extend two lists of lists in python, so that item 1 of the first list of lists extends with item 1 of the second list of lists, and so forth.
I'm new to this and self-taught, so could be missing something very simple, but I can't find an answer anywhere.
This is what I feel the code should be, but obviously not working.
list1[x].extend(list2[x]) for x in list1
What I'm trying to achieve is this:
list1 = [[1,2,3],[4,5,6],[7,8,9]]
list2 = [[a,b,c],[d,e,f],[g,h,i]]
output = [[1,2,3,a,b,c],[4,5,6,d,e,f],[7,8,9,g,h,i]]
Any ideas?
You can use zip:
list1 = [[1,2,3],[4,5,6],[7,8,9]]
list2 = [['a','b','c'], ['d','e','f'], ['g','h','i']]
output = [sub1 + sub2 for sub1, sub2 in zip(list1, list2)]
print(output)
# [[1, 2, 3, 'a', 'b', 'c'], [4, 5, 6, 'd', 'e', 'f'], [7, 8, 9, 'g', 'h', 'i']]
Use zip() to loop over the two lists in parallel. Then use extend() to append the sublist from list2 to the corresponding sublist in list1.
for l1, l2 in zip(list1, list2):
l1.extend(l2)
print(list1)
list1[x].extend(list2[x]) does achieve the result you want for one pair of lists, if list1[x] is [1, 2, 3] and list2[x] is [a, b, c], for example.
That means x has to be an index:
x = 0
list1[x].extend(list2[x])
# now the first list in `list1` looks like your desired output
To do that for every pair of lists, loop over all possible indexes x – range(upper) is the range of integers from 0 (inclusive) to upper (exclusive):
for x in range(len(list1)):
list1[x].extend(list2[x])
# now `list1` contains your output
To produce a new list of lists instead of altering the lists in list1, you can concatenate lists with the + operator instead:
>>> [1, 2, 3] + ['a', 'b', 'c']
[1, 2, 3, 'a', 'b', 'c']
output = []
for x in range(len(list1)):
output.append(list1[x] + list2[x])
And finally, the idiomatic Python for this that you’ll get around to someday is:
output = [x1 + x2 for x1, x2 in zip(list1, list2)]
I have simply used list comprehension with list addition, while zipping the correlated lists together
list1 = [[1,2,3],[4,5,6],[7,8,9]]
list2 = [['a','b','c'], ['d','e','f'], ['g','h','i']]
list3 = [l1+l2 for l1, l2 in zip(list1, list2)]
print(list3)
[[1, 2, 3, 'a', 'b', 'c'], [4, 5, 6, 'd', 'e', 'f'], [7, 8, 9, 'g', 'h', 'i']]

Sorting Key in Python3 [duplicate]

This question already has answers here:
Sort list of lists ascending and then descending [duplicate]
(3 answers)
Closed 3 years ago.
I have a list of lists as myList = [['a',1],['b',4],['a',5], ['b',6]].I want to sort this list alphabetically with first element as the key which I can do as myList.sort(key=lambda x:x[0]) which changes myList to [['a', 1], ['a', 5], ['b', 4], ['b',6]]. But if the first elements of the inner lists are the same, I want to sort it in descending order of the second element of the inner list and get the result as [['a', 5], ['a', 1], ['b', 6], ['b',4]]. What is the cleaner way to do it? I could have done this in Javascript as
myList.sort((a,b) => {
if(a[0] == b[0]){
return b[1] > a[1]
} else {
return b[0] < a[0]
}
})
How do I achieve this in python?
Use a tuple as a key:
myList.sort(key=lambda x:(x[0], -x[1]))
# myList = [['a', 5], ['a', 1], ['b', 6], ['b', 4]]

How to combine two list of lists to a new list [duplicate]

This question already has answers here:
How to get the cartesian product of multiple lists
(17 answers)
Closed 7 years ago.
I have a problem like this. I have two lists, A and B, where A=[[1,2],[3,4],[5,6]] and B=[["a","b"],["c","d"]], I would like to got a new list from these two like
C = [
[[1,2],["a","b"]],
[[3,4],["a","b"]],
[[1,2],["c","d"]],
[[3,4],["c","d"]]
]
I had try the following code:
A = [[1,2],[3,4]]
B=[["a","b"],["c","d"]]
for each in A:
for evey in B:
print each.append(evey)
However, the output is None.
Any helpful information are appreciated. Thank you.
By the way, I had try to replace the "append" with simple "+". The output is a list which elements are not list.
This was answered here: Get the cartesian product of a series of lists?
Try this:
import itertools
A = [[1,2],[3,4]]
B = [["a","b"],["c","d"]]
C = []
for element in itertools.product(A,B):
C.append(list(element))
print C
This is one way to do it:
A = [[1,2],[3,4]]
B=[["a","b"],["c","d"]]
C = zip(A,B)
The output here is a list of tuples:
[([[1, 2], [3, 4]],), ([['a', 'b'], ['c', 'd']],)]
If you want a list of lists, you can do this:
D = [list(i) for i in zip(A, B)]
The output:
[[[1, 2], ['a', 'b']], [[3, 4], ['c', 'd']]]
Try this. You have to append each couple of elements in each iteration.
result = []
for each in A:
for evey in B:
result.append([each,evey])
>>>result
[[[1, 2], ['a', 'b']],
[[1, 2], ['c', 'd']],
[[3, 4], ['a', 'b']],
[[3, 4], ['c', 'd']]]
OR
simply use itertools.product
>>>from itertools import product
>>>list(product(A,B))
[([1, 2], ['a', 'b']),
([1, 2], ['c', 'd']),
([3, 4], ['a', 'b']),
([3, 4], ['c', 'd'])]
You can use itertools.product to achieve this.
import itertools
list(itertools.product(A,B)) # gives the desired result
[([1, 2], ['a', 'b']),
([1, 2], ['c', 'd']),
([3, 4], ['a', 'b']),
([3, 4], ['c', 'd']),
([5, 6], ['a', 'b']),
([5, 6], ['c', 'd'])]
itertools.product(*iterables[, repeat])
It returns the Cartesian product of input iterables
Eg.
product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
Don't print return value of append(), try this:
A = [[1,2],[3,4]]
B=[["a","b"],["c","d"]]
C = []
for each in B:
for evey in A:
C.append([evey, each])
print C

Categories

Resources