+ 8
How to add extra statements in a python list comprehension?
I wanted to find the highs and lows in a list which contains random data. This was the way I accomplished it.. https://code.sololearn.com/cxFtz17P4CDh/?ref=app While this works fine, I tried doing the same using list comprehension but to no avail, so how do I do that within the list comprehension?
26 Réponses
+ 7
The code is ok, but still missing the task description. Why this sequence of numbers as output?
+ 6
I'm still not sure if this is what you want, since I have no idea about finance. :)
If you need the indexes of the highest and lowest points and the info if they are high or low, I would do this:
x = [4, 1, 5, 8, 4, 9, 3, 5, 9, 1, 7]
hilo = [
('high' if n==max(x) else 'low', i)
for i, n in enumerate(x)
if n==max(x) or n==min(x)
]
+ 4
There is a max and min function...but...as you've used the term "highest and lowest" I assume you need to return all the values higher than a pre-defined value and values lower than that pre-defined value.
Give a sample input and expected output.
I don''t understand how the output of your prog does what your post is asking to do.
+ 4
I fully agree with rodwynnejones, we need a clear description what to do so that we can help.
+ 4
Hm... not really sure what you're aiming to do...
Can you maybe give a simple series of inputs and outputs to illustrate?
+ 4
Well still not quite clear for me, what is your criteria for the output, but here is my two cents. You seem to be building two lists, one for the high values and the other for the low values. The way I see it, if we look for local peaks then we need to compare 3 adjacent values (a, b, c) and we have a peak at b when a<b>c
Hence my idea is to use the zip function.
Same logic with local lows.
The first and last value in the series wouldn't be considered in either group (but this should not matter in a longer series).
One more idea to improve this, is to also store the index (timestamp or x axis) of the datapoint, instead of just the value. You can use the enumerate function for this and change the list comprehension into a dict comprehension, with the timestamp as key.
Another undefined case, when two consecutive values are equal. (is that a high or low or neither...)
https://code.sololearn.com/cGpaHFSjbO1a/?ref=app
+ 3
For me this is still a lack of information comparing the input to the output values. There are 14 input values and 7 output values. This needs more and precice definition and information.
+ 3
Tibor Santa
Excellent!, this is exactly what I wanted, but the first and last values are very important and should not be ignored, as there are decisions that depend on those values.
If there are two consecutive equal values, they will be considered as one value.
+ 3
Mohamed Khalaf ultimately, list comprehensions are not always the best solution to all problems.
When dealing with long series, the itertools library is always worth checking, it has a ton of utility functions to handle iterators (lazy sequences). Also the pandas library has neat tricks for statistical analysis.
In the meantime I had some other ideas for your problem, for example to visualize the direction of the trend between two datapoints, and using itertools.groupby() to determine the local peaks and lows precisely. See my code for more details.
https://code.sololearn.com/crZuWRjf3c9x/?ref=app
+ 2
Still don't get it...your function (upLo(input)) returns a tuple which is then unpacked into "H" and "L" but your output is a list.
I cant see how you output relates to your input.
+ 2
By using functions you can have as many statements as you need:
def f(x):
if x % 2 == 0 and x % 3 == 0:
return "Divisible by 2 and 3."
elif x % 3 == 0:
return "Divisible by 3."
elif x % 2 == 0:
return "Divisible by 2."
else:
return "Not divisible by 2 or 3."
[f(i) for i in range(10)]
But if you are one-liner you can use list comprehensions, but you can't use non-evaluating statements:
["Divisible by 2 and 3." if i % 2 == 0 and i % 3 == 0 else ("Divisible by 3." if i % 3 == 0 else ("Divisible by 2." if i % 2 == 0 else "Not divisible by 2 or 3.")) for i in range(10)]
+ 2
Tibor Santa
I actually use the pandas library in my daily work but I wanted to do that away from the libraries in order to reach a deeper understanding.
I am very thankful to you for your interest and effort. 😊
+ 1
Maybe you find here what you need?
https://code.sololearn.com/ck6HicJ6Z8jG/?ref=app
+ 1
Lothar
This is a job for time series analysis to find where are highs and lows in the entire sequence. basically as you iterate through the data if you go from ascending to descending you have a (high), and from descending to ascending you have a (low). I hope that you would understand.
+ 1
Lothar
HonFu
In order, where is the lowest and highest number in this list [1, 3]?
There is no doubt that No. 1 is the lowest and No. 3 is the highest.
What would happen if there were a lot of random numbers, e.g. [1, 2, 3, 2, 1]?
By the same logic, the result will be..
Low >>> 1
High >>> 3
Low >>> 1
This concept is widely used in analyzing financial markets
+ 1
HonFu
I appreciate your efforts to help me, but it's okay. Thank you anyway 🙏😊
0
input = [9, 8, 7, 6, 1, 2, 3, 4, 5, 3, 6, 8, 17, 20]
def upLo(input):
pre, top, low, era = input[0], [], [], None
# I want to do that using list comprehension..👇
for val in input[1:]:
if not era and val > pre:
era = 1
low.append(pre)
elif (era is None or era) and val < pre:
era = 0
top.append(pre)
pre = val
if era:
top.append(input[-1])
else:
low.append(input[-1])
return top , low
print(upLo(data))
👇
Expected output: ([9, 5, 8, 20], [1,3,7])
0
HonFu
Sorry, there was a typing error, and I edited my comment.
0
Lothar
I have a loop that contains more than one statement that I want to convert into list comprehension. In another words, I just want to learn how we can write complex for statements into a single line.
0
Am a beginner, how will i start?